有一个表格,其中有
y
(年)、m
月、d
(日)列。如何在2个日期之间选择查询?喜欢:
select * from my_table where y m d between '2018-12-01' and '2021-01-01'
这里有两个问题:
y >= '2018' AND m >= '12' AND d >= '01' AND y <= '2021' AND m <= '01' AND d <= '01'
的内容导致 m
必须大于 12
,因此没有选择其他月份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 之上 - 所以问题应该是普遍的。
使用嵌套日期分区架构的问题在于,在两个日期之间进行选择绝非易事,尤其是当您的日期范围跨越多个月/年时。
截至今天,我仍然没有找到首选嵌套模式的用例。一个平的。
对于你的第一点,你的查询是错误的,你需要将你的条件括在括号中才能使其工作。这是可行的,但就像我说的,这不是一个漂亮的解决方案。
你可以这样做:
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答案,似乎可以连接年、月、日列并使用
BETWEEN
运算符,仍然利用这些列是分区键的事实。
为了确定起见,运行两个查询并检查扫描的数据量是否保持不变,在这种情况下,您可以自由使用
concat
。
这个效果很好
select * from my_table
where concat_ws('-',y, m, d) between '2018-12-01' and '2021-01-01'
分区修剪在这种情况下效果很好,而且看起来简单多了