有一个表,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之上-所以问题应该是普遍的。
2条答案
按热度按时间alen0pnh1#
使用嵌套日期分区模式的问题是,在两个日期之间进行选择永远不会很容易,特别是如果日期范围跨越多个月/年。
到目前为止,我还没有找到一个嵌套模式比平面模式更好的用例。
至于你的第一点,你的查询是错误的,你需要把你的条件用括号括起来才能让它工作。这是可行的,但就像我说的,不是一个漂亮的解决方案。
你可以这样做:
字符串
正如你所看到的,这很简单。如果你有机会,我会重组你的数据库,让它有一个平面分区模式,分区键是
yyyy-mm-dd
。编辑:
根据this的回答,似乎可以concat年,月,日列并使用
BETWEEN
操作符,仍然利用这些列是分区键的事实。只是为了确保,运行两个查询并检查扫描的数据量是否保持不变,在这种情况下,您可以自由使用
concat
。a1o7rhls2#
这工程罚款
字符串
在这种情况下,分区修剪工作得很好,而且看起来简单得多