处理架构更新 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

处理架构更新

本部分提供了有关为各种数据格式处理架构更新的指导。Athena 是一种基于读取的查询引擎。这意味着,当您在 Athena 中创建一个表时,它会在读取数据时应用架构。它不会改变或者重写底层数据。

如果您期望表架构有所变化,则在创建表架构时应考虑采用一种适合您的需求的数据格式。您的目标是对于不断演进的架构仍能再利用现有的 Athena 查询,同时避免在查询包含分区的表时发生架构不匹配错误。

为实现这些目标,请基于下列主题中的表选择表的数据格式。

Summary: Athena 中的更新和数据格式

下表总结了数据存储格式及其支持的架构处理方式。使用此表有助于您选择格式,即使架构随时间发生了变化,也可继续使用 Athena 查询。

在此表中,您可以观察到 Parquet 和 ORC 的列式格式具有不同的默认列访问方法。默认情况下,Parquet 将按名称访问列,ORC 按索引(序数值)访问列。Therefore, Athena provides a SerDe property defined when creating a table to toggle the default column access method which enables greater flexibility with schema evolution.

对于 Parquet,可将 parquet.column.index.access 属性设为 true,这样可将列访问方法设置为使用列的序号。将此属性设为 false 会将列访问方法改为使用列名称。同样,ORC 使用 orc.column.index.access 属性控制列访问方法。有关更多信息,请参阅 ORC 和 Parquet 中的索引访问

除了将列重新排序或在表的开头添加列之外,可通过 CSV 和 TSV 进行所有其他架构操作。例如,如果架构演进只需要将列重新命名而不需要删除它们,您可以选择创建 CSV 或 TSV 格式的表。如果您需要删除列,请不要使用 CSV 或 TSV,而要使用任何其他支持的格式,最好是列式格式(例如 Parquet 或 ORC)。

Athena 中的架构更新和数据格式
架构更新的预期类型 摘要 CSV(带或不带标头)和 TSV JSON AVRO PARQUET: Read by Name (default) PARQUET: Read by Index ORC: Read by Index (default) ORC: Read by Name
重命名列 将您的数据存储为 CSV 和 TSV;或存储为 ORC 和 Parquet(如果按索引读取)。
在表的开头或中间添加新列 将您的数据存储为 JSON、AVRO;或存储为 Parquet 和 ORC(如果按名称读取)。不要使用 CSV 和 TSV。
在表的末尾添加列 将您的数据以 CSV 或 TSV、JSON、AVRO、ORC 或 Parquet 格式存储。
删除列 将您的数据存储为 JSON、AVRO;或存储为 Parquet 和 ORC(如果按名称读取)。不要使用 CSV 和 TSV。
对列重新排序 将您的数据存储为 AVRO、JSON;或存储为 ORC 和 Parquet(如果按名称读取)。
更改列的数据类型 将您的数据存储为任何格式,但请在 Athena 中测试您的查询,以确保数据类型兼容。对于 Parquet 和 ORC,更改数据类型仅适用于分区表。

ORC 和 Parquet 中的索引访问

PARQUET 和 ORC 是列式数据存储格式,可以按索引或名称读取。将数据存储为这两种格式之一,可在执行所有架构操作和运行 Athena 查询时确保不会产生架构不匹配的错误。

  • Athena reads ORC by index by default, as defined in SERDEPROPERTIES ( 'orc.column.index.access'='true'). For more information, see ORC: Read by Index.

  • Athena reads Parquet by name by default, as defined in SERDEPROPERTIES ( 'parquet.column.index.access'='false'). For more information, see PARQUET: Read by Name.

Since these are defaults, specifying these SerDe properties in your CREATE TABLE queries is optional, they are used implicitly. 如果使用这些属性,则允许您运行一些架构更新操作,同时防止其他类似操作。To enable those operations, run another CREATE TABLE query and change the SerDe settings.

注意

The SerDe properties are not automatically propagated to each partition. Use ALTER TABLE ADD PARTITION statements to set the SerDe properties for each partition. 要自动执行该流程,请编写一个运行 ALTER TABLE ADD PARTITION 语句的脚本。

以下各部分详细描述了这些情况。

ORC: Read by Index

默认情况下,ORC 格式的表是按索引读取的。这是由以下语法定义的:

WITH SERDEPROPERTIES ( 'orc.column.index.access'='true')

按索引读取允许您将列重新命名。但这样的设置无法删除列或在表的中间添加列。

To make ORC read by name, which will allow you to add columns in the middle of the table or remove columns in ORC, set the SerDe property orc.column.index.access to false in the CREATE TABLE statement. 如使用此配置,将无法将列重新命名。

注意

When orc.column.index.access is set to false, Athena becomes case sensitive. This can prevent Athena from reading data if you are using Spark, which requires lower case, and have column names that use uppercase. The workaround is to rename the columns to lower case.

以下示例演示了如何将 ORC 更改为按名称读取:

CREATE EXTERNAL TABLE orders_orc_read_by_name ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' WITH SERDEPROPERTIES ( 'orc.column.index.access'='false') STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 's3://schema_updates/orders_orc/';

Parquet: Read by Name

默认情况下,Parquet 格式的表是按名称读取的。这是由以下语法定义的:

WITH SERDEPROPERTIES ( 'parquet.column.index.access'='false')

按名称读取允许您在表中间添加列或删除列。但该设置无法将列重新命名。

To make Parquet read by index, which will allow you to rename columns, you must create a table with parquet.column.index.access SerDe property set to true.