在日期/时间范围内查询配置单元分区表

时间:2014-06-27 06:53:49

标签: hadoop mapreduce hive bigdata hiveql

我的hive表按年,月,日,小时分区

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

我知道有一个选项是在纪元(或yyyy-mm-dd-hh)和查询传递纪元时间创建分区。 我可以在不丢失日期层次的情况下完成吗?

表格结构

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

3 个答案:

答案 0 :(得分:8)

这是我们每天在查询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 

希望这有帮助

答案 1 :(得分:2)

你可以像这样查询

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

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

我在我的样本表上运行它,它完全正常。

答案 2 :(得分:0)

您可以将 CONCAT与LPAD一起使用

假设您要获取2020-03-24(小时= 00到2020-04-24,小时= 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')