本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
處理架構更新
本節指導處理各種資料格式的結構描述更新。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
預期的結構描述更新類型 | 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
陳述式false
中orc.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
。