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

Car*_*nis 2 amazon-s3 amazon-web-services amazon-athena

主要问题:

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

select * from <database>.<table> where $path = 'know/path/'
Run Code Online (Sandbox Code Playgroud)

给定存储桶顶层的表定义,如果没有指定分区但存储桶是使用前缀组织的,它是否会扫描整个表?还是像分区一样将扫描限制在指定路径?有没有参考官方声明?

具体案例:

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

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

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

The*_*heo 8

2023 年更新:自从我在下面写下答案以来,Athena 添加了对仅读取与 上的谓词匹配的文件的支持$path

\n

Athena 没有任何优化来限制在$path查询中使用时扫描的文件。SELECT * FROM some_table您可以通过运行和比较扫描的字节来亲自验证这一点SELECT * FROM some_table WHERE $path = \'\xe2\x80\xa6\'(它们将是相同的,如果有优化,它们将不同 \xe2\x80\x93\xc2\xa0 当然假设有多个文件)。

\n

请参阅按“$path”字段查询Athena:$path 与分区

\n
\n

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

\n

您可以使用类似于下表属性的内容来设置它(使用实际的列名代替id_col_1id_col_2显然,

\n
CREATE EXTERNAL TABLE some_table\n\xe2\x80\xa6\nTBLPROPERTIES (\n  "projection.id_col_1.type" = "injected",\n  "projection.id_col_2.type" = "injected",\n  "storage.location.template" = "s3://bucket/${id_col_1}/${id_col_2}/"\n)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n