我希望我的 Amazon Athena 查询结果返回结果中每一行的 Amazon Simple Storage Service (Amazon S3) 源文件位置。
简短描述
您可以编写 Athena 查询,为查询返回的数据返回源文件路径。
- 要查找包含 Athena 表中特定行返回的数据的 Amazon S3 文件,请运行 SELECT $path 查询。
- 要查找与特定 Amazon S3 文件关联的 Athena 表行,请运行带有 WHERE $path 条件的 SELECT 查询。
解决方法
**先决条件:**在运行本文中的查询之前,必须具备以下条件:
- 一个 Athena 表。如果您没有表,请运行 CREATE TABLE 语句。
- 具有运行 Athena 查询的权限的 AWS Identity and Access Management (IAM) 用户或角色。
从 Athena 表中查找与某行关联的 S3 文件
要查找 Athena 表中某行的 S3 源文件路径,请运行与以下示例类似的查询:
-
要返回所需的数据,请对您的表运行 SELECT 查询:
SELECT * FROM "my_database"."my_table" WHERE year=2019;
-
要查找数据的 Amazon S3 源文件,请运行类似于以下内容的查询:
SELECT "$path" FROM "my_database"."my_table" WHERE year=2019;
前面的查询会返回数据的 Amazon S3 路径:
s3://awsexamplebucket/datasets_mytable/year=2019/data_file1.json
查找来自特定 S3 文件的 Athena 表行
要查找 Athena 表中包含特定 S3 源文件的所有行,请参阅以下步骤:
-
确认您要检索行的 Amazon S3 对象的名称和位置。如果您不知道对象名称和位置,请运行 ls 命令列出特定 S3 存储桶或前缀下的对象。在以下示例中,将 s3://awsexamplebucket/my_table/my_partition/ 替换为您的分区路径。
aws s3 ls s3://awsexamplebucket/my_table/my_partition/
-
要返回与 Amazon S3 文件关联的数据,请对您的表运行 SELECT 查询:
SELECT *, "$path" FROM "my_database"."my_table" WHERE regexp_like("$path", 's3://awsexamplebucket/my_table/my_partition/file-01.csv')
前面的查询返回的数据来自您指定的 Amazon S3 路径:
id name year $path
3 John 1999 's3://awsexamplebucket/my_table/my_partition/file-01.csv'
4 Jane 2000 's3://awsexamplebucket/my_table/my_partition/file-01.csv'
Athena 查询通过 regexp_like 函数支持通配符功能。例如,要返回来自路径中包含相同字符串的所有源文件的数据,请运行如下查询:
SELECT *, "$path" FROM "my_database"."my_table" WHERE regexp_like("$path", 'file-1')
此查询返回文件路径名中包含 file-1 的所有行:
id name year $path
13 Mia 2009 's3://awsexamplebucket/my_table/my_partition/file-10.csv'
14 Mary 2010 's3://awsexamplebucket/my_table/my_partition/file-10.csv'
15 Max 2011 's3://awsexamplebucket/my_table/my_partition/file-11.csv'
16 Merriam 2012 's3://awsexamplebucket/my_table/my_partition/file-12.csv'
相关信息
Parquet SerDe
连接到数据来源
获取 Amazon S3 中源数据的文件位置