hive 如何在presto中有效地选择2个按年划分的日期之间的数据?

3okqufwl  于 2023-11-18  发布在  Hive
关注(0)|答案(2)|浏览(252)

有一个表,y(年),m(月),d(日)列。如何选择2个日期之间的查询?如:

select * from my_table where y m d between '2018-12-01' and '2021-01-01'

字符串
这里有两个问题:
1.使用类似y >= '2018' AND m >= '12' AND d >= '01' AND y <= '2021' AND m <= '01' AND d <= '01'导致m的值必须大于12,因此未选择其他月份
1.使用日期函数date (date_parse(y || m || d, '%Y%m%d')) between date (date_parse('20181201', '%Y%m%d')) and date (date_parse('20210101', '%Y%m%d'))-导致HIVE_EXCEEDED_PARTITION_LIMIT。看起来between date每秒(毫秒?)
那么如何选择between日期条件并有效地做到这一点呢?

备注

我也添加了标记spark,因为presto运行在spark之上-所以问题应该是普遍的。

alen0pnh

alen0pnh1#

使用嵌套日期分区模式的问题是,在两个日期之间进行选择永远不会很容易,特别是如果日期范围跨越多个月/年。
到目前为止,我还没有找到一个嵌套模式比平面模式更好的用例。
至于你的第一点,你的查询是错误的,你需要把你的条件用括号括起来才能让它工作。这是可行的,但就像我说的,不是一个漂亮的解决方案。
你可以这样做:

SELECT whatever
  FROM my_table
 WHERE (year = '2018' AND month = '12')
    OR (year BETWEEN '2019' AND '2020')
    OR (year = '2021' AND month = '01' AND day = '01')

字符串
正如你所看到的,这很简单。如果你有机会,我会重组你的数据库,让它有一个平面分区模式,分区键是yyyy-mm-dd
编辑:
根据this的回答,似乎可以concat年,月,日列并使用BETWEEN操作符,仍然利用这些列是分区键的事实。
只是为了确保,运行两个查询并检查扫描的数据量是否保持不变,在这种情况下,您可以自由使用concat

a1o7rhls

a1o7rhls2#

这工程罚款

select * from my_table 
 where concat_ws('-',y, m, d) between '2018-12-01' and '2021-01-01'

字符串
在这种情况下,分区修剪工作得很好,而且看起来简单得多

相关问题