我在查询 Amazon Athena 中的表。如何才能确定输出中各行的源是哪个 Amazon Simple Storage Service(Amazon S3)文件,或者哪些行对应于某个特定文件?
简短描述
- 要确定哪个 Amazon S3 文件包含 Athena 表中某个特定行返回的数据,可使用 SELECT $path 查询。
- 要确定 Athena 表的哪些行与特定 Amazon S3 文件关联,可使用 WHERE $path 条件运行 SELECT 查询。
此类查询可用于调查意外数据和构建需要源数据相关信息的查询。
解决方法
运行以下查询之前,请确保您已拥有以下资源:
- 一个 Athena 表。如果您没有表,请运行 CREATE TABLE 语句。
- 具有运行 Athena 查询权限的 AWS Identity and Access Management(IAM)用户或角色。
要查找与 Athena 表中某一行关联的 S3 文件:
1. 对您的表运行 SELECT 查询,以返回您想要的数据:
SELECT * FROM "my_database"."my_table" WHERE year=2019;
2. 要查找该数据的 Amazon S3 源文件,请运行类似于以下内容的查询:
SELECT "$path" FROM "my_database"."my_table" WHERE year=2019;
查询将返回该数据的 Amazon S3 路径:
s3://awsexamplebucket/datasets_mytable/year=2019/data_file1.json
要返回 Athena 表中源自特定 Amazon S3 文件的某些行:
1. 确认您要检索的行的 Amazon S3 对象的名称和位置。如果您不知道对象名称和位置,请运行 ls 命令以列出特定 S3 存储桶或前缀下的对象。在下面的示例中,将 s3://awsexamplebucket/my_table/my_partition/ 替换为您分区的路径。
aws s3 ls s3://awsexamplebucket/my_table/my_partition/
2. 在 Athena 中,对您的表运行 SELECT 查询,以返回与 Amazon S3 文件关联的数据:
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'
该查询还支持一些通配符功能。例如,要返回包含某文件名一部分的所有数据,可运行类似以下查询:
SELECT *,"$path" FROM "my_database"."my_table" WHERE regexp_like("$path", '\-02')
此查询将返回文件名包含 -02 所有行:
id name year $path
13 Mia 2009 's3://awsexamplebucket/my_table/my_partition/file-02.csv'
14 Mary 2010 's3://awsexamplebucket/my_table/my_partition/file-02.csv'
15 Max 2011 's3://awsexamplebucket/my_table/my_partition/file-02.csv'
16 Merriam 2012 's3://awsexamplebucket/my_table/my_partition/file-02.csv'
相关信息
Parquet SerDe
连接到数据源