“$path”是不是限制 Athena 扫描的数据量?

Posted

技术标签:

【中文标题】“$path”是不是限制 Athena 扫描的数据量?【英文标题】:Does "$path" limit the amount of data scanned by Athena?“$path”是否限制 Athena 扫描的数据量? 【发布时间】:2020-09-04 18:36:11 【问题描述】:

主要问题:

我似乎无法找到关于 $path 在 Athena 的 where 子句中使用时如何工作的确切信息。

select * from <database>.<table> where $path = 'know/path/'

给定存储桶顶层的表定义,如果没有指定分区但存储桶是使用前缀组织的,它会扫描整个表吗?或者它是否以类似于分区的方式将扫描限制在指定路径?有没有关于这方面的官方声明的参考?

具体案例:

我有信息存储在s3中,这个信息需要每天统计查询一两次,前缀是两个不同的ID(s3:bucket/IDvalue1/IDvalue2/),然后是相关数据的文件。在给定的一天,可能会创建任意数量的新文件夹(在繁忙的日子可能是数万天)或将新文件添加到现有前缀中。因此,更新分区目录似乎有点复杂。

一种避免分区的建议方法是在从已知的 ID 组合获取数据时使用 $path,但我似乎无法确定使用这种方法是否实际上会限制每个查询扫描的数据量。我读了一条评论说它没有,但我在文档中找不到它,我想知道是否有人知道它是如何工作的并且可以指出正确的参考。

到目前为止,谷歌搜索和阅读文档并没有澄清这一点。

【问题讨论】:

我建议通过运行查询来简单测试它,并将 Athena 中显示的扫描数据与 S3 存储桶的整体大小进行比较。 @PhilippJohannis 你是对的,我测试过了,它不限制扫描的数据 【参考方案1】:

在查询中使用 $path 时,Athena 没有任何优化来限制扫描的文件。您可以通过运行 SELECT * FROM some_tableSELECT * FROM some_table WHERE $path = '…' 并比较扫描的字节数来验证这一点(它们将是相同的,如果有优化,它们会有所不同——当然假设有多个文件)。

见Query by "$path" field和Athena: $path vs. partition


对于您的用例,我建议将partition projection 与注入类型一起使用。通过这种方式,您可以限制 Athena 将扫描的 S3 上的前缀,同时不必显式添加分区。

您可以使用类似于下表的属性进行设置(显然,使用实际的列名代替 id_col_1id_col_2):

CREATE EXTERNAL TABLE some_table
…
TBLPROPERTIES (
  "projection.id_col_1.type" = "injected",
  "projection.id_col_2.type" = "injected",
  "storage.location.template" = "s3://bucket/$id_col_1/$id_col_2/"
)

请注意,当查询使用注入类型的分区投影的表时,所有查询都必须包含投影列的显式值。

【讨论】:

非常感谢,这绝对是一个很好的回应,你说得对,我测试过,路径没有任何优化,我将深入研究我的用例的分区投影

以上是关于“$path”是不是限制 Athena 扫描的数据量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制

AWS Athena 并发限制:提交的查询数 VS 正在运行的查询数

Aws Athena View 列数限制?

AWS Athena数据集的注意事项? TSV

AWS Athena 上的偏移量

将数据从 Athena 或 Redshift 获取到 Sage maker 或 AWS Forecast 而不是平面文件