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

  • MSCK REPAIR TABLE がフォルダとそのサブフォルダの両方をスキャンして一致するパーティションスキームを検索するため、別個のテーブルのデータは別個のフォルダ階層に保存するようにしてください。例えば、テーブル 1 のデータが s3://DOC-EXAMPLE-BUCKET1 にあり、テーブル 2 のデータが s3://DOC-EXAMPLE-BUCKET1/table-2-data にあるとします。両方のテーブルが文字列でパーティション分割されている場合、MSCK REPAIR TABLE はテーブル 2 のパーティションをテーブル 1 に追加します。これを回避するには、この代わりに s3://DOC-EXAMPLE-BUCKET2s3://DOC-EXAMPLE-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 の実行後、AWS Glue Data Catalog のテーブルにパーティションが追加されない場合は、以下をチェックしてください。

  • AWS Glue アクセス – AWS Identity and Access Management (IAM) ロールに、glue:BatchCreatePartition アクションを許可するポリシーがあることを確認します。詳細については、このドキュメントで後述する「IAM ポリシーで glue:BatchCreatePartition を許可する」を参照してください。

  • Amazon S3 アクセス – ロールに s3:DescribeJob アクションを含む Amazon S3 にアクセスするために、十分なアクセス許可を持つポリシーがあることを確認します。許可する Simple Storage Service (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 を実行すると、「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 パスの 1 つ以上のオブジェクトキーが小文字ではなくキャメルケースになっている場合、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 ユーザーガイド」の「オブジェクトキー命名ガイドライン」と「バケット命名規則」を参照してください。