查询日期/时间范围内的hive分区表



我的hive表是按年、月、日、时进行分区的

现在我想获取从2014-05-27到2014-06-05的数据我怎么能做到呢?

我知道一个选项是在epoch(或yyyy-mm-dd-hh)上创建分区,并在查询中传递epoch时间。我能在不丢失日期层次结构的情况下做到这一点吗?

表结构
CREATE TABLE IF NOT EXISTS table1 (col1 int, col2 int)
PARTITIONED BY (year int, month int, day int, hour int) 
STORED AS TEXTFILE;

这是我们每天在hive中查询表时遇到的类似场景。我们按照您解释的方式对表进行了分区,这对查询有很大帮助。下面是我们分区的方式:

CREATE TABLE IF NOT EXISTS table1 (col1 int, col2 int)
PARTITIONED BY (year bigint, month bigint, day bigint, hour int) 
STORED AS TEXTFILE;

对于分区,我们这样赋值:

year = 2014, month = 201409, day = 20140924, hour = 01

这样查询就变得非常简单,你可以直接查询:

select * from table1 where day >= 20140527 and day < 20140605 

希望能有所帮助

可以这样查询

  WHERE st_date > '2014-05-27-00' and end_date < '2014-06-05-24' 

应该给你想要的结果,因为即使它是一个字符串,它也会按字典顺序进行比较,即'2014-04-04'总是比'2014-04-03'大。

我在我的示例表上运行它,它运行得非常好。

您可以使用CONCAT与LPAD

假设您想要获取2020-03-24,hour=00到2020-04-24,hour=23之间的所有分区,那么,您的'where'条件将如下所示:

WHERE (CONCAT(year, '-', LPAD(month,2,'0'), '-', LPAD(day,2,'0'), '_', LPAD(hour,2,'0')) > '2020-03-24_00')
AND (CONCAT(year, '-', LPAD(month,2,'0'), '-', LPAD(day,2,'0'), '_', LPAD(hour,2,'0')) < '2020-04-24_23')

最新更新