【问题标题】:AWS Athena - Query data from different years in partitionsAWS Athena - 在分区中查询不同年份的数据
【发布时间】:2021-04-29 17:54:51
【问题描述】:

我们有大型数据集在 S3 中分区,例如 s3://bucket/year=YYYY/month=MM/day=DD/file.csv

在 Athena 中查询不同年份的数据并利用分区的最佳方法是什么?

这是我对 2018-03-07 到 2020-03-06 的数据尝试的:

查询 1 - 在我取消之前运行了 2 分 45 秒

SELECT dt, col1, col2
FROM mytable
WHERE year BETWEEN '2018' AND '2020'
AND dt BETWEEN '2018-03-07' AND '2020-03-06'
ORDER BY dt

查询 2 - 运行大约 2 分钟。但是,如果时间段是从 2005 年到 2020 年,我认为效率不高

SELECT dt, col1, col2
FROM mytable
WHERE (year = '2018' AND month >= '03' AND dt >= '2018-03-07')
OR year = '2019' OR (year = '2020' AND month <= '03' AND dt <= '2020-03-06')
ORDER BY dt

【问题讨论】:

    标签: sql amazon-web-services hive partitioning amazon-athena


    【解决方案1】:

    稍微修改了您的第二个查询(year &gt; '2018' AND year &lt; '2020') 而不是year='2019' 并且在day 而不是dt 上有一个条件(我没有在分区中看到日期)?

    SELECT *
    FROM award WHERE 
    (year = '2018' AND ((month = '03' AND day >= '07') OR month > '03'))
    OR 
    (year > '2018' AND  year < '2020') 
    OR 
    (year = '2020' AND (month < '03' OR (month = '03' OR day <= '06')))
    

    【讨论】:

    • 不,这不适用于 2018-04-012020-02-20 这样的日期。
    • dt 是 CSV 文件中的一列。
    【解决方案2】:

    我建议仅按 dt (yyyy-MM-dd) 而不是 yearmonthday 对表进行重新分区,这很简单,并且分区修剪将起作用,尽管使用仅年份过滤器(如 @)的查询987654324@应该改写为dt&gt;'2020-01-01'等等。

    Hive 分区修剪中的 BTW 也适用于如下查询:

    where concat(year, '-', month, '-', day) >= '2018-03-07'
          and 
          concat(year, '-', month, '-', day) <= '2020-03-06'
    

    我无法检查是否在 Presto 中执行相同的工作,但值得一试。您可以使用|| 运算符代替concat()

    【讨论】:

    • 我已经尝试使用concat,查询大约需要 45 秒才能完成。查询是这样的SELECT dt, col1, col2 FROM mytable WHERE concat(year, '-', month, '-', day) &gt;= '2018-03-07' AND concat(year, '-', month, '-', day) &lt;= '2020-03-06' AND dt BETWEEN '2018-03-07' AND '2020-03-06' ORDER BY dt
    • @Marius 太棒了!然后它也可以在 Presto 中使用
    • 我喜欢这个答案!
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2021-01-20
    • 2020-05-16
    • 2019-04-15
    • 2019-04-08
    • 2020-10-16
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多