使用 Amazon Athena 查询 Amazon S3 清单 - Amazon Simple Storage Service

使用 Amazon Athena 查询 Amazon S3 清单

您可以在 Athena 可用的所有区域通过 Amazon Athena,使用标准 SQL 来查询 Amazon S3 清单。要检查 AWS 区域 可用性,请参阅 AWS 区域 表

Athena 可以查询 ORC、Parquet 或 CSV 格式的 Amazon S3 清单文件。当您使用 Athena 查询清单时,我们建议您使用 ORC 格式或 Parquet 格式的清单文件。ORC 和 Parquet 格式提供了更快的查询性能并能够降低查询成本。ORC 和 Parquet 是自我描述、可感知类型的列式文件格式,专为 Apache Hadoop 而设计。列式格式允许读取器仅读取、解压缩并处理当前查询所需的列。所有 AWS 区域 均提供 ORC 和 Parquet 格式的 Amazon S3 清单。

开始使用 Athena 查询 Amazon S3 清单
  1. 创建 Athena 表。有关创建表的信息,请参阅《Amazon Athena 用户指南》中的在 Amazon Athena 中创建表

    下面的示例查询在 ORC 格式的清单报告中包含所有可选字段。删除您的清单没有选择的所有可选字段,以便查询对应于您的清单的选定字段。而且,您必须使用您的存储桶名称和位置指向清单的目标路径。根据您的配置替换以下存储桶名称和清单位置:s3://destination-prefix/DOC-EXAMPLE-BUCKET/config-ID/hive/。您还应该将 projection.dt.range 下的初始日期替换为第一天的日期。

    CREATE EXTERNAL TABLE your_table_name( bucket string, key string, version_id string, is_latest boolean, is_delete_marker boolean, size bigint, last_modified_date bigint, e_tag string, storage_class string, is_multipart_uploaded boolean, replication_status string, encryption_status string, object_lock_retain_until_date bigint, object_lock_mode string, object_lock_legal_hold_status string, intelligent_tiering_access_tier string, bucket_key_status string, checksum_algorithm string ) PARTITIONED BY ( dt string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.dt.type" = "date", "projection.dt.format" = "yyyy-MM-dd-HH-mm", "projection.dt.range" = "2022-01-01-00-00,NOW", "projection.dt.interval" = "1", "projection.dt.interval.unit" = "HOURS" );

    在使用 Athena 查询 Parquet 格式的清单报告时,请在 ROW FORMAT SERDE 语句中使用以下 Parquet SerDe 代替 ORC SerDe。

    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'

    在使用 Athena 查询 CSV 格式的清单报告时,使用下列模板。

    CREATE EXTERNAL TABLE your_table_name( bucket string, key string, version_id string, is_latest boolean, is_delete_marker boolean, size string, last_modified_date string, e_tag string, storage_class string, is_multipart_uploaded boolean, replication_status string, encryption_status string, object_lock_retain_until_date string, object_lock_mode string, object_lock_legal_hold_status string, intelligent_tiering_access_tier string, bucket_key_status string, checksum_algorithm string ) PARTITIONED BY ( dt string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.dt.type" = "date", "projection.dt.format" = "yyyy-MM-dd-HH-mm", "projection.dt.range" = "2022-01-01-00-00,NOW", "projection.dt.interval" = "1", "projection.dt.interval.unit" = "DAYS" );
  2. 在执行此步骤后,您可以对自己的清单运行即席查询,如以下示例中所示。

    # Get list of latest inventory report dates available SELECT DISTINCT dt FROM your_table_name ORDER BY 1 DESC limit 10; # Get encryption status for a provided report date. SELECT encryption_status, count(*) FROM your_table_name WHERE dt = 'YYYY-MM-DD-HH-MM' GROUP BY encryption_status; # Get encryption status for report dates in the provided range. SELECT dt, encryption_status, count(*) FROM your_table_name WHERE dt > 'YYYY-MM-DD-HH-MM' AND dt < 'YYYY-MM-DD-HH-MM' GROUP BY dt, encryption_status;

有关使用 Athena 的更多信息,请参阅 Amazon Athena 用户指南

下面是用于 Amazon S3 清单的 REST 操作。