處理架構更新 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

處理架構更新

本節指導處理各種資料格式的結構描述更新。Athena 是 schema-on-read 查詢引擎。這表示當您在 Athena 中建立資料表時,將於讀取資料時套用結構描述。並不會變更或重寫基礎資料。

如果您預期資料表結構描述會變更,請考慮以符合您需要的資料格式建立結構描述。您的目標是隨著不斷演變的結構描述而重複使用現有的 Athena 查詢,並避免在查詢含有分割區的資料表時,發生結構描述不符的錯誤。

為了達到這些目標,請根據下列主題中的表格來選擇資料表的資料格式。

根據資料格式支援的結構描述更新

下表彙總資料儲存格式及其支援的結構描述操作。使用此資料表協助您選擇格式,即使結構描述隨著時間而變更,此格式也能讓您繼續使用 Athena 查詢。

在此表格中,請注意 Parquet 並且ORC是具有不同預設資料行存取方法的欄格式。默認情況下,Parquet 將通過名稱和索ORC引(序數值)訪問列。因此,Athena 會在建立資料表時提供定義的 SerDe 屬性,以切換預設資料欄存取方法,以提供結構描述演進的更大彈性。

對於 Parquet,parquet.column.index.access 屬性可以設為 true,以設定資料欄存取方法來使用資料欄的序號。將此屬性設為 false 會變更欄存取方法來使用欄名稱。同樣,對於ORC使用orc.column.index.access屬性來控制列訪問方法。如需詳細資訊,請參閱了解阿帕奇ORC和阿帕奇鑲木地板索引訪問

CSV並TSV允許您執行所有模式操作,除了重新排序列或在表的開頭添加列。例如,如果您的結構描述演進只需要重新命名欄,而不需要移除它們,您可以選擇在CSV或中建立資料表TSV。如果您需要移除欄,請勿使用CSV或TSV,而是使用任何其他支援的格式,最好是使用欄格式,例如 Parquet 或. ORC

Athena 中的結構描述更新和資料格式
預期的結構描述更新類型 Summary CSV(帶和不帶標題)和 TSV JSON AVRO PARQUET:按名稱讀取(默認) PARQUET:按索引讀取 ORC:按索引讀取(默認) ORC:按名稱閱讀
重新命名欄 如果通過索引讀取 CSVTSV,則將數據存儲在ORC和,或者和鑲木地板中。 Y N N N Y Y N
在資料表開頭或中間新增欄 將您的數據存儲在 JSONAVRO,或在 Parquet 中,ORC如果它們是按名稱讀取的。請勿使用CSV和TSV。 N Y Y Y N N Y
在資料表尾端新增欄 將您的資料儲存在CSV或TSV、、JSONAVROORC、或實木複合地板中。 Y Y Y Y Y Y Y
移除欄 將您的數據存儲在 JSONAVRO,或 Parquet 中ORC,如果它們是按名稱讀取的。請勿使用CSV和TSV。 N Y Y Y N N Y
重新排序欄 如果按名稱讀取數據AVRO,請將數據存儲在JSON或ORC和鑲木地板中。 N Y Y Y N N Y
變更欄的資料類型 以任何格式存放資料,但在 Athena 中測試您的查詢,以確保資料類型相容。對於 Parquet 和ORC,變更資料類型僅適用於分區資料表。 Y Y Y Y Y Y Y

了解阿帕奇ORC和阿帕奇鑲木地板索引訪問

PARQUET和ORC是可以通過索引或名稱讀取的單欄數據存儲格式。以這些格式存放資料可讓您對結構描述執行所有操作和執行 Athena 查詢,而不會發生結構描述不符的錯誤。

  • ORC依預設,Athena 依據索引讀取,如中所定義SERDEPROPERTIES ( 'orc.column.index.access'='true')。如需詳細資訊,請參閱ORC:按索引讀取

  • Athena 根據預設依名稱讀取 Parquet,如 SERDEPROPERTIES ( 'parquet.column.index.access'='false') 中所定義。如需詳細資訊,請參閱Parquet:依名稱讀取

由於這些屬性是預設值,因此在CREATE TABLE查詢中指定這些 SerDe 屬性是可選的,因此會以隱含方式使用它們。使用時可讓您執行一些結構描述更新操作,同時會防止其他這類操作。若要啟用這些作業,請執行其他CREATE TABLE查詢並變更 SerDe 設定。

注意

SerDe 屬性會自動傳播到每個分區。使用ALTER TABLE ADD PARTITION陳述式來設定每個分割區的 SerDe屬性。若要讓這個程序自動化,請編寫可執行 ALTER TABLE ADD PARTITION 陳述式的指令碼。

下列各節詳細說明這些案例。

ORC:按索引讀取

依預設,中ORC的表格會由索引讀取。這是由下列語法所定義:

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

依索引讀取可讓您重新命名欄。但之後您就無法在資料表中間移除欄或新增欄。

若要依名稱進行ORC讀取,這可讓您在資料表中間新增資料欄或移除中的欄ORC,請在CREATE TABLE陳述式falseorc.column.index.access將 SerDe 屬性設定為。在此組態中,您將無法重新命名欄。

注意

在 Athena 引擎版本 2 中,當ORC表格設定為依名稱讀取時,Athena 會要求ORC檔案中的所有欄名稱均為小寫。由於 Apache Spark 在產生ORC檔案時不會小寫欄位名稱,因此 Athena 可能無法讀取如此產生的資料。解決方法是重新以小寫字母命名資料欄,或使用 Athena 引擎版本 3。

下列範例說明如何變更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://amzn-s3-demo-bucket/orders_orc/';

Parquet:依名稱讀取

預設會依名稱讀取 Parquet 資料表。這是由下列語法所定義:

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

依名稱讀取可讓您在資料表中間新增欄及移除欄。但之後您就無法重新命欄。

若要讓 Parquet 透過索引讀取,這可讓您重新命名欄,您必須建立parquet.column.index.access SerDe 屬性設定為的表格true