選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

MSCK REPAIR TABLE

焦點模式
MSCK REPAIR TABLE - Amazon Athena

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

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

新增 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,直到所有分割區都已新增為止。如需詳細資訊,請參閱分割您的資料

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

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

  • 由於 MSCK REPAIR TABLE 會同時掃描資料夾及其子資料夾,以尋找相符的分割區配置,請務必將個別資料表的資料留在不同的資料夾階層中。例如,假設您有 中資料表 1 的資料,s3://amzn-s3-demo-bucket1以及 中資料表 2 的資料s3://amzn-s3-demo-bucket1/table-2-data。如果兩個資料表都以字串分割, MSCK REPAIR TABLE會將資料表 2 的分割區新增至資料表 1。為了避免這種情況,請s3://amzn-s3-demo-bucket2改用 s3://amzn-s3-demo-bucket1和 等不同的資料夾結構。請注意,此行為與 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 TABLE或 的 DDL 查詢MSCK REPAIR TABLE,則會收到錯誤訊息 FAILED:NullPointerException 名稱為 null

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

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

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

允許 IAM 政策中的 glue:BatchCreatePartition

檢閱連接至您用來執行 MSCK REPAIR TABLE 之角色的 IAM 政策。當您AWS Glue Data Catalog 搭配 Athena 使用 時,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://amzn-s3-demo-bucket/path/userId=1/ s3://amzn-s3-demo-bucket/path/userId=2/ s3://amzn-s3-demo-bucket/path/userId=3/

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

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

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

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

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

在本頁面

下一個主題:

SHOW COLUMNS

上一個主題:

DROP VIEW
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。