Amazon S3 中的表位置 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon S3 中的表位置

在 Athena 中运行 CREATE TABLE 查询时,您将表注册到 AWS Glue Data Catalog。如果您使用 Athena 自身的目录,我们强烈建议您升级到 AWS Glue Data Catalog。您在 LOCATION 属性中指定数据的路径,如以下缩写示例中所示:

CREATE EXTERNAL TABLE `test_table`( ... ) ROW FORMAT ... STORED AS INPUTFORMAT ... OUTPUTFORMAT ... LOCATION s3://bucketname/prefix/

Amazon S3 中的此位置包含表示您的表的所有 文件。有关更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的使用文件夹

重要

Athena 读取存储在 's3://bucketname/prefix/' 下的所有 数据。如果您有 希望 Athena 读取的数据,请不要使用 Athena 所读取的同一个 Amazon S3 前缀来存储这些数据。如果您在使用分区确保 Athena 扫描某个分区中的数据,则 WHERE 筛选条件必须包括该分区。有关更多信息,请参阅表位置和分区

当您在 Athena CREATE TABLE 语句中指定数据的 Amazon S3 位置时,请使用这些提示和示例:

  • LOCATION 子句中,请使用尾部斜杠。

    使用:

    s3://bucketname/prefix/
  • 请勿使用以下任何项目来指定数据的 LOCATION

    • 请勿使用文件名、下划线、通配符或 glob 模式来指定文件位置。

    • 请勿将完整 HTTP 表示法(例如 s3.amazon.com)添加到 Amazon S3 存储桶路径。

    • 请勿使用 Amazon S3 访问点。但是,对于并非通过 Amazon S3 访问点提供的对象,只要 Amazon S3 存储桶策略没有明确拒绝对其的请求,则对于具有合适访问权限的请求者,应可从 Athena 访问对象。

    • 请勿在路径中使用空的前缀(带额外的 /),如下所示:S3://bucketname/prefix//prefix/。虽然这是有效的 Amazon S3 路径,但 Athena 不允许并会将其更改为 s3://bucketname/prefix/prefix/,删除额外的 /。

      请勿使用

      s3://path_to_bucket s3://path_to_bucket/* s3://path_to_bucket/mySpecialFile.dat s3://bucketname/prefix/filename.csv s3://test-bucket.s3.amazon.com S3://bucket/prefix//prefix/ arn:aws:s3:::bucketname/prefix https://accesspointname-<number>.s3-accesspoint.<region>.amazonaws.com

表位置和分区

您的源数据可以基于一组列按 Amazon S3 前缀分组,这也称为分区。例如,这些列可以表示创建特定记录的年、月和日。

创建表时,您可以选择使其分区。当 Athena 针对未分区的表执行 SQL 查询时,它使用来自表分区定义的 LOCATION 属性作为基本路径,以列出并随后扫描所有可用文件。您必须首先使用分区信息更新 AWS Glue Data Catalog,然后才能查询已分区的表。此信息表示特定分区中文件的架构,以及该分区的文件在 Amazon S3 中的 LOCATION。要了解 AWS Glue 爬网程序如何添加分区,请参阅 AWS Glue 开发人员指南 中的爬网程序如何确定何时创建分区?要了解如何配置爬网程序以使其在现有分区中为数据创建表,请参阅将多个数据源和爬网程序一起使用。在 Athena 中,您还可以直接在表中创建分区。有关更多信息,请参阅分区数据

Athena 对已分区的表执行查询时,它首先检查以确认在查询的 WHERE 子句中是否使用了任何分区列。如果使用了分区列,则 Athena 请求 AWS Glue Data Catalog返回与指定分区列匹配的分区规范。分区规范包含 LOCATION 属性,从而告知 Athena 在读取数据时应使用哪个 Amazon S3 前缀。在这种情况下, 扫描使用此前缀存储的数据。如果不在 WHERE 子句中使用已分区的列,则 Athena 将扫描属于表的分区的所有文件。

有关在 Athena 中使用分区来提升查询性能和降低查询成本的示例,请参阅 Amazon Athena 的最佳性能优化提示