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

问题描述 投票:5回答:3

我的配置单元表按年,月,日,小时划分

现在我想从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;
hadoop mapreduce hive bigdata hiveql
3个回答
8
投票

这是我们在配置单元中查询表时每天都会遇到的类似情况。我们已经按照与您解释的方式相似的方式对表进行了分区,并且在查询时也有很大帮助。这就是我们分割的方式:

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 

希望这会有所帮助


2
投票

您可以这样查询

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

[应该给您期望的结果,因为即使它很刺人,也要按字典顺序进行比较,即'2014-04-04'始终会大于'2014-04-03'。

我在示例表上运行它,效果很好。


0
投票

您可以使用CONCAT with 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')
© www.soinside.com 2019 - 2024. All rights reserved.