資料表和分割區中的更新 - Amazon Athena

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

資料表和分割區中的更新

在 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。Parquet 預設會依名稱讀取索引)。

  • 對於 CSV、JSON 和 Avro,Athena 使用以索引為基礎的結構描述驗證。這表示如果您遇到結構描述不符的錯誤,則應該捨棄導致結構描述不符的分割區,並重新建立分割區,讓 Athena 在查詢它時不會失敗。

Athena 會比較資料表的結構描述與分割區結構描述。如果您在 Athena 中以 AWS Glue 爬蟲程式建立 CSV、JSON 和 AVRO 資料表,當爬蟲程式完成處理之後,資料表及其分割區的結構描述可能不同。如果資料表的結構描述與分割區結構描述不相符,則您在 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 PARTITIONALTER TABLE ADD PARTITION