【问题标题】:Athena: Minimize data scanned by query including JOIN operationAthena:最小化查询扫描的数据,包括 JOIN 操作
【发布时间】:2018-01-10 05:56:30
【问题描述】:

让 Athena 中有一个外部表,它指向 s3 上以 parquet 格式存储的大量数据。它包含很多列,并在一个名为“timeid”的字段上进行分区。现在,还有另一个将 timeid 映射到日期的外部表(小表)。

当较小的表也在 timeid 上进行分区并且我们将它们连接到它们的分区 id (timeid) 并将日期放入 where 子句中时,仅从包含与该日期对应的 timeids 的大表中扫描那些特定的记录。此处不扫描全部数据。

但是,如果较小的表未按 timeid 分区,则即使在日期列存在条件的情况下也会进行完整的数据扫描。

有没有办法避免在大分区表与未分区小表连接时进行全数据扫描?这是必需的,因为小表中每个 timeid 仅包含一条记录,并且可能不会为每个记录创建单独的文件。

【问题讨论】:

    标签: amazon-web-services join partitioning amazon-athena


    【解决方案1】:

    这是一个有趣的发现!

    您也许能够通过使用子查询而不是连接来避免大扫描

    代替:

    SELECT ...
    FROM large-table
    JOIN small-table
    WHERE small-table.date > '2017-08-03'
    

    你也许可以使用:

    SELECT ...
    FROM large-table
    WHERE large-table.date IN
             (SELECT date from small-table
              WHERE date > '2017-08-03')
    

    我没有测试过,但是这样可以避免你提到的 JOIN。

    【讨论】:

    • 我测试了你建议的嵌套查询。在嵌套查询的情况下,无论小表是否分区,它都会进行全数据扫描。另外,我可能还需要从小表中选择一些字段,这就是我需要执行连接的原因。
    猜你喜欢
    • 2020-02-04
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2019-10-16
    • 2022-11-21
    • 2017-10-22
    相关资源
    最近更新 更多