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

问题描述 投票:0回答:2

有一个表格,其中有

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
    ,因此没有选择其他月份
  2. 使用日期函数
    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 之上 - 所以问题应该是普遍的。

apache-spark hive presto
2个回答
1
投票

使用嵌套日期分区架构的问题在于,在两个日期之间进行选择绝非易事,尤其是当您的日期范围跨越多个月/年时。

截至今天,我仍然没有找到首选嵌套模式的用例。一个平的。

对于你的第一点,你的查询是错误的,你需要将你的条件括在括号中才能使其工作。这是可行的,但就像我说的,这不是一个漂亮的解决方案。

你可以这样做:

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


0
投票

这个效果很好

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

分区修剪在这种情况下效果很好,而且看起来简单多了

© www.soinside.com 2019 - 2024. All rights reserved.