我的配置单元表按年,月,日,小时划分
现在我想从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;
这是我们在配置单元中查询表时每天都会遇到的类似情况。我们已经按照与您解释的方式相似的方式对表进行了分区,并且在查询时也有很大帮助。这就是我们分割的方式:
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 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')