我的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;
答案 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')