MSCK REPAIR TABLE - Amazon Athena

MSCK REPAIR TABLE

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

MSCK REPAIR TABLE コマンドは、テーブルが作成された後でファイルシステムに追加された Hive 互換パーティションについて、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 を実行してください。詳細については、「データのパーティション分割」を参照してください。

  • 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 と同じであることに注意してください。

  • コマンドは Amazon S3 の HeadObject および GetObject コマンドを実行するファイルシステムをトラバースするため、ファイルシステムが大きい、または大量のデータが含まれている場合、スキャンされるバイト数のコストが高額になる可能性があります。コストを見積もるには、Amazon S3 の料金AWS Pricing Calculator を参照してください。

Synopsis

MSCK REPAIR TABLE table_name

Examples

MSCK REPAIR TABLE orders;

Troubleshooting

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

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

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

  • 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/