本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資料表和分割區中的更新
在 Athena 中,資料表及其分割區必須使用相同的資料格式,但其結構描述可能不同。當您建立新的分割區時,該分區通常會繼承資料表的結構描述。隨著時間經過,結構描述可能開始不同。原因包括:
-
如果資料表的結構描述變更,分割區的結構描述不會更新,而無法與資料表的結構描述保持同步。
-
AWS Glue 爬行者程式可讓您探索具有不同綱要之分割區中的資料。這表示,如果您在 Athena 中建立資料表 AWS Glue,在爬行者程式完成處理之後,資料表及其分割區的結構定義可能會有所不同。
-
如果您直接使用 AWS API 新增分割區。
如果含有分割區的資料表符合下列限制條件,Athena 會成功處理資料表。如果不符合這些限制條件,Athena 會發出 HIVE_PARTITION_SCHEMA_MISMATCH
錯誤。
-
每個分割區的結構描述與資料表的結構描述相容。
-
資料表的資料格式允許您想要執行的更新類型:新增、刪除、重新排序欄,或變更欄的資料類型。
例如,對於 CSV 和 TSV 格式,您可以重新命名欄、在資料表尾端新增欄,以及變更欄的資料類型 (如果類型相容),但您無法移除欄。對於其他格式,您可以新增或移除欄,或將欄變更為另一種資料類型 (如果類型相容)。如需相關資訊,請參閱摘要:Athena 中的更新和資料格式。
避免含有分割區的資料表發生結構描述不符的錯誤
在開始執行查詢時,Athena 會檢查資料表與分割區之間的每個資料欄資料類型是否相容,以驗證資料表的結構描述。
-
對於 Parquet 和 ORC 資料儲存類型,Athena 倚賴資料欄名稱,並使用它們來進行以資料欄名稱為基礎的結構描述驗證。這樣可避免含有分割區的 Parquet 和 ORC 資料表發生
HIVE_PARTITION_SCHEMA_MISMATCH
錯誤。(如果 SerDe 屬性設置為按名稱訪問索引,則對 ORC 來說是如此:orc.column.index.access=FALSE
。 實木複合地板默認情況下按名稱讀取索引)。 -
對於 CSV、JSON 和 Avro,Athena 使用以索引為基礎的結構描述驗證。這表示如果您遇到結構描述不符的錯誤,則應該捨棄導致結構描述不符的分割區,並重新建立分割區,讓 Athena 在查詢它時不會失敗。
Athena 會比較資料表的結構描述與分割區結構描述。如果您使用爬行者程式在 Athena 中以 CSV、JSON 和 AVRO 建立資料表,則在 AWS Glue 爬行者程式完成處理之後,表格及其分割區的結構定義可能會有所不同。如果資料表的結構描述與分割區結構描述不相符,則您在 Athena 中的查詢會失敗,因為發生類似如下的結構描述驗證錯誤:'crawler_test.click_avro' is declared as type 'string', but partition 'partition_0=2017-01-17' declared column 'col68' as type 'double'."
('crawler_test.click_avro' 宣告為類型 'string',但分割區 'partition_0=2017-01-17' 將資料欄 'col68' 宣告為類型 'double'。)
這類錯誤的典型解決方法是捨棄造成錯誤的分割區,然後重新建立。如需詳細資訊,請參閱ALTER TABLE DROP PARTITION及ALTER TABLE ADD PARTITION。