MSCK REPAIR TABLE - Amazon Athena

MSCK REPAIR TABLE

Hive 互換パーティションを追加した後でカタログ内のメタデータを更新するには、MSCK REPAIR TABLE コマンドを使用します。

MSCK REPAIR TABLE コマンドは、テーブルの作成後にファイルシステムに追加された Hive 互換パーティションで Simple Storage Service (Amazon S3) などのファイルシステムをスキャンします。MSCK REPAIR TABLE は、テーブルメタデータのパーティションと S3 のパーティションを比較します。テーブルの作成時に指定した S3 の場所に新しいパーティションが存在する場合は、これらのパーティションがメタデータと Athena のテーブルに追加されます。

物理パーティションを追加すると、カタログ内のメタデータがファイルシステム内のデータのレイアウトと整合しなくなるので、新しいパーティションに関する情報をカタログに追加する必要があります。メタデータを更新するには、Athena から新しいパーティションのデータをクエリできるように MSCK REPAIR TABLE を実行します。

注記

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 では、他のプロトコル (s3a://bucket/folder/ など) を使用する場所は、そこにあるテーブルに対して MSCK REPAIR TABLE クエリを実行する場合にクエリが失敗する原因になります。

  • MSCK REPAIR TABLE ではフォルダとそのサブフォルダの両方をスキャンして一致するパーティションスキームを探すため、テーブルごとにデータを個別のフォルダ階層に保存するようにしてください。例えば、テーブル A のデータが s3://table-a-data にあり、テーブル B のデータが s3://table-a-data/table-b-data にあるとします。両方のテーブルが文字列でパーティション分割されている場合、MSCK REPAIR TABLE はテーブル B のパーティションをテーブル A に追加します。これを避けるには、その代わりに s3://table-a-data および s3://table-b-data といった個別のフォルダ構造を使用します。この動作は、Amazon EMR および Apache Hive と同じであることに注意してください。

概要

MSCK REPAIR TABLE table_name

MSCK REPAIR TABLE orders;

トラブルシューティング

MSCK REPAIR TABLE の実行後、AWS Glue Data Catalog のテーブルにパーティションが追加されない場合は、以下をチェックしてください。

  • AWS Identity and Access Management (IAM) ユーザーまたはロールに、glue:BatchCreatePartition アクションを許可するポリシーがあることを確認します。

  • IAM のユーザーまたはロールに Amazon S3 にアクセスするために十分なアクセス許可を持つポリシーがあることを確認します。これには s3:DescribeJob アクションが含まれます。許可する Simple Storage Service (Amazon S3) アクションの例については、「Athena での Amazon S3 バケットへのクロスアカウントアクセス」のバケットポリシー例を参照してください。

  • Simple Storage Service (Amazon S3) パスがキャメルケースではなく小文字になっていることを確認します (例えば、userId ではなく userid)。

  • クエリのタイムアウトMSCK REPAIR TABLE は、初めてテーブルを作成する場合、またはデータとパーティションメタデータ間のパリティについて不確実性がある場合の使用に最適です。MSCK REPAIR TABLE を使用して新しいパーティションを頻繁に追加し (例えば、日常的に追加するなど)、クエリのタイムアウトが発生している場合は、ALTER TABLE ADD PARTITION の使用を検討してください。

  • ファイルシステムからパーティションが欠落している – Amazon S3 でパーティションを手動で削除してから MSCK REPAIR TABLE を実行すると、「Partitions missing from filesystem」というエラーメッセージが表示される場合があります。これは、MSCK REPAIR TABLE がテーブルメタデータから古いパーティションを削除しないために発生します。削除済みのパーティションをテーブルメタデータから除外するには、代わりに ALTER TABLE DROP PARTITION を実行します。SHOW PARTITIONS も同様に、ファイルシステムのパーティションではなく、メタデータのパーティションだけをリストすることに注意してください。

  • 「NullPointerException 名は null です」というエラー

    AWS Glue CreateTable API 操作や AWS CloudFormation AWS::Glue::Table テンプレートを使用して、TableType プロパティを指定せずに Athena で使用するテーブルを作成し、SHOW CREATE TABLE または MSCK REPAIR TABLE などの DDL クエリを実行すると、「失敗: 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 パスは小文字にする必要があります。S3 パスがキャメルケースの場合、MSCK REPAIR TABLE は AWS Glue Data Catalog にパーティションを追加しません。たとえば、S3 パスが userId の場合、次のパーティションは AWS Glue Data Catalog に追加されません。

s3://bucket/path/userId=1/ s3://bucket/path/userId=2/ s3://bucket/path/userId=3/

この問題を解決するには、キャメルケースではなくフラットケースを使用します。

s3://bucket/path/userid=1/ s3://bucket/path/userid=2/ s3://bucket/path/userid=3/