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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 中的表位置

在 Athena 中运行 CREATE TABLE 查询时,您将表注册到 AWS Glue Data Catalog。(如果您使用 Athena 的较旧内部目录,我们强烈建议您升级到 AWS Glue Data Catalog。)

要在 Amazon S3 中指定数据的路径,请使用 LOCATION 属性,如以下示例中所示:

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

Amazon S3 中的 LOCATION 指定表示您的表的所有 文件。

重要

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

CREATE TABLE 语句中指定 LOCATION 时,请使用以下准则:

  • 使用尾部斜杠。

    使用:

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

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

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

    • 请勿在 Amazon S3 子句中指定 访问点LOCATION。表位置只能指定为 URI。

    • 请勿在路径中使用空文件夹,例如 //,如下所示:S3://bucketname/folder//folder/。 虽然这是有效的 Amazon S3 路径,但 Athena 不允许并会将其更改为 s3://bucketname/folder/folder/,从而删除额外的 /

      请勿使用

      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 s3://arn:aws:s3:<region>:<account_id>:accesspoint/<accesspointname> 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 的最佳性能优化提示