MSCK REPAIR TABLE - Amazon Athena

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

MSCK REPAIR TABLE

新增 Hive 相容分割區之後,請使用 MSCK REPAIR TABLE 命令來更新目錄中的中繼資料。

MSCK REPAIR TABLE 命令會掃描檔案系統(例如 Amazon S3),以查找在建立資料表後新增到檔案系統的 Hive 相容分隔區。MSCK REPAIR TABLE 會比較資料表中繼資料中的分割區和 S3 中的分割區。如果您在建立資料表時指定的 S3 位置有新的分割區,它會將這些分割區新增至中繼資料和 Athena 資料表中。

當您新增實體分割區時,目錄中的中繼資料會變得與檔案系統中的資料配置不一致,而且需要將新分割區的相關資訊新增至目錄。若要更新中繼資料,請執行 MSCK REPAIR TABLE,如此可讓您從 Athena 查詢新分割區中的資料。

注意

MSCK REPAIR TABLE 只會將分割區新增至中繼資料,而不會刪除它們。若要在 Amazon S3 中手動刪除分割區後從中繼資料移除分割區,請執行 ALTER TABLE table-name DROP PARTITION 命令。如需詳細資訊,請參閱ALTER TABLE DROP PARTITION

考量與限制

使用 MSCK REPAIR TABLE 時,請謹記以下幾點:

  • 新增所有分割區可能需要花一些時間。如果此操作逾時,則會處於不完整狀態,只有幾個分割區新增到目錄。您應該在同一個資料表上執行 MSCK REPAIR TABLE,直到所有分割區都已新增為止。如需更多詳細資訊,請參閱 在 Athena 中分割資料

  • 對於與 Hive 不相容的分割區,請使用 ALTER TABLE ADD PARTITION 載入分割區,以便查詢資料。

  • 要搭配 Athena 使用的分割區位置必須使用 s3 通訊協定 (例如,s3://bucket/folder/)。在 Athena 中,當在包含的資料表上執行 MSCK REPAIR TABLE 查詢時,使用其他通訊協定的位置 (例如 s3a://bucket/folder/) 會導致查詢失敗。

  • 由於 MSCK REPAIR TABLE 會同時掃描資料夾及其子資料夾,以尋找相符的分割區配置,請務必將個別資料表的資料留在不同的資料夾階層中。例如,假設您在 s3://table-a-data 中有資料表 A 的資料,在 s3://table-a-data/table-b-data 中有資料表 B 的資料。如果兩個資料表都以字串分割,MSCK REPAIR TABLE 會將資料表 B 的分割區新增至資料表 A 中。為避免此情況,請改用單獨的資料夾結構,如 s3://table-a-datas3://table-b-data。請注意,此行為與 Amazon EMR 和 Apache Hive 一致。

  • 由於已知問題的緣故,只要分割區的值中含有冒號 (:) 字元 (例如分割區的值為時間戳記),MSCK REPAIR TABLE 就會執行失敗且未出現任何提示。解決方法是使用 ALTER TABLE ADD PARTITION

  • MSCK REPAIR TABLE 不會新增以底線 (_) 開頭的分割區資料欄名稱。若要解決此限制,請使用 ALTER TABLE ADD PARTITION

概要

MSCK REPAIR TABLE table_name

範例

MSCK REPAIR TABLE orders;

疑難排解

執行 MSCK REPAIR TABLE 之後,如果 Athena 未將分割區新增至 AWS Glue Data Catalog 的資料表中,請檢查下列事項:

  • AWS Glue 存取 – 確定 AWS Identity and Access Management (IAM) 角色具有允許 glue:BatchCreatePartition 動作的政策。如需詳細資訊,請參閱本文件稍後的允許 IAM 政策中的 glue:BatchCreatePartition

  • Amazon S3 存取 – 確定角色具有足夠許可以存取 Amazon S3 的政策,包括 s3:DescribeJob 動作。如需允許哪些 Amazon S3 動作的範例,請參閱 Athena 中的 Amazon S3 儲存貯體跨帳戶存取 中的儲存貯體政策範例。

  • Amazon S3 物件金鑰大小寫 – 請確定 Amazon S3 路徑是小寫而不是小駝峰式命名法 (例如,userid 而非 userId),或使用 ALTER TABLE ADD PARTITION 指定物件金鑰名稱。如需詳細資訊,請參閱本文件稍後的變更或重新定義 Amazon S3 路徑

  • 查詢逾時MSCK REPAIR TABLE最適合在第一次建立資料表時使用,或者在資料和分割區中繼資料之間存不確定的同位時使用。如果您經常使用 MSCK REPAIR TABLE 新增分割區(例如每天)並正經歷查詢逾時,請考慮使用 ALTER TABLE ADD PARTITION

  • 檔案系統中遺失分割區 - 如果您在 Amazon S3 中手動刪除分割區,然後執行 MSCK REPAIR TABLE,則您可能會收到錯誤訊息檔案系統中遺失分割區。這是因為 MSCK REPAIR TABLE 不會從資料表中繼資料中移除過時的分割區。若要從資料表中繼資料移除已刪除的分割區,請改為執行 ALTER TABLE DROP PARTITION。請注意,SHOW PARTITIONS 同樣地只會列出中繼資料中的分割區,而不會列出檔案系統中的分割區。

  • "NullPointerException name is null" (NullPointerException 名稱為 null) 錯誤

    如果您使用 AWS Glue CreateTable API 操作或 AWS CloudFormation AWS::Glue::Table 範本建立一個要在 Athena 中使用的資料表,而不指定 TableType 屬性,然後執行像 SHOW CREATE TABLEMSCK REPAIR TABLE 的 DDL 查詢,您會收到錯誤訊息 FAILED: NullPointerException Name is null (失敗:NullPointerException 名稱為 null)。

    若要解決錯誤,請為 TableInput TableType 屬性指定值作為 AWS Glue CreateTable API 呼叫或 AWS CloudFormation 範本的一部分。TableType 可能的值包括 EXTERNAL_TABLEVIRTUAL_VIEW

    此需求僅適用於當您使用 AWS Glue CreateTable API 操作或 AWS::Glue::Table 範本建立資料表時。如果您使用 DDL 陳述式或 AWS Glue 爬蟲程式建立 Athena 資料表,則系統會為您自動定義 TableType 屬性。

下列各節提供了一些額外的詳細資訊。

允許 IAM 政策中的 glue:BatchCreatePartition

檢閱連接至您用來執行 MSCK REPAIR TABLE 之角色的 IAM 政策。在您搭配 Athena 使用 AWS Glue Data Catalog 時,IAM 政策必須允許 glue:BatchCreatePartition 動作。如需允許 glue:BatchCreatePartition 動作的 IAM 政策範例,請參閱 AWS 受管政策:AmazonAthenaFullAccess

變更或重新定義 Amazon S3 路徑

如果 Amazon S3 路徑中的一或多個物件金鑰是駝峰式大小寫,則 MSCK REPAIR TABLE 可能不會將分割區新增到 AWS Glue Data Catalog。例如,如果您的 Amazon S3 路徑包含物件金鑰名稱 userId,則下列分割區可能不會新增到 AWS Glue Data Catalog:

s3://DOC-EXAMPLE-BUCKET/path/userId=1/ s3://DOC-EXAMPLE-BUCKET/path/userId=2/ s3://DOC-EXAMPLE-BUCKET/path/userId=3/

要解決此問題,請執行下列項目之一:

  • 建立 Amazon S3 物件金鑰時,請使用小寫字母而非駝峰式大小寫:

    s3://DOC-EXAMPLE-BUCKET/path/userid=1/ s3://DOC-EXAMPLE-BUCKET/path/userid=2/ s3://DOC-EXAMPLE-BUCKET/path/userid=3/
  • 使用 ALTER TABLE ADD PARTITION 重新定義位置,如下列範例所示:

    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (userId=1) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=1/' PARTITION (userId=2) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=2/' PARTITION (userId=3) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=3/'

請注意,雖然 Amazon S3 物件金鑰名稱可以使用大寫,但 Amazon S3 儲存貯體名稱本身必須始終為小寫。如需詳細資訊,請參閱《Amazon S3 使用者指南》中的物件金鑰命名準則儲存貯體命名規則