我想以 CSV 之外的格式(例如 JSON 或压缩格式)存储 Amazon Athena 查询结果。
解决方法
Athena 仅支持 CSV 输出文件。UNLOAD 查询会将来自 SELECT 语句的查询结果编写为指定的数据格式。UNLOAD 支持的格式包括 Apache Parquet、ORC、Apache Avro 和 JSON。CSV 是 Athena SELECT 查询使用的唯一输出格式,但您可以使用 UNLOAD 将 SELECT 查询的输出编写为 UNLOAD 支持的格式。尽管您可以使用 CTAS 语句以 CSV 之外的格式输出数据,但这些语句还需要在 Athena 中创建表。当您希望以非 CSV 格式输出 SELECT 查询的结果但不需要关联表时,UNLOAD 语句非常有用。例如,下游应用程序可能要求 SELECT 查询的结果为 JSON 格式,而如果您打算使用 SELECT 查询的结果进行其他分析,Parquet 或 ORC 可能会提供优于 CSV 的性能优势。
如果要以其他格式存储查询输出文件,请使用 CREATE TABLE AS SELECT (CTAS) 查询并配置 format 属性。在查询完成后,请删除 CTAS 表。请记住以下几点:
- 您可以将 format 设置为 ORC、PARQUET、AVRO、JSON 或 TEXTFILE。如果您未指定 CTAS 查询的格式,Athena 将默认使用 Parquet。
- 参数 format 名称必须用小写字母列出,否则 CTAS 查询将失败。有关示例,请参阅示例:以不同的格式编写查询结果。
- 默认情况下,所有 CTAS 查询都会使用 GZIP 压缩。如果是 Parquet 和 ORC,您可以使用 parquet_compression 和 orc_compression 选项指定其他压缩类型,例如 SNAPPY。有关示例,请参阅示例:指定数据存储和压缩格式。
- 对于基于文本的格式,您可以指定 field_delimiter,如下所示:WITH (field_delimiter = ',')。如果您未指定字段分隔符,则 Athena 将默认使用 \001。
- 如果在 CTAS 查询中使用 external_location 参数,请确保 Amazon Simple Storage Service (Amazon S3) 位置不含任何数据。否则,您可能会看到如下所示的错误:HIVE_PATH_ALREADY_EXISTS: Target directory for table 'table_name' already exists: s3://AWSDOC-EXAMPLE-BUCKET(HIVE_PATH_ALREADY_EXISTS:表 'table_name' 的目标目录已存在:s3://AWSDOC-EXAMPLE-BUCKET)。有关 external_location 参数的更多信息,请参阅 CTAS 表属性。
相关信息
CTAS 查询的注意事项和限制