MSCK REPAIR TABLE - Amazon Athena

MSCK REPAIR TABLE

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

MSCK REPAIR TABLE コマンドは、テーブルの作成後にファイルシステムに追加または削除された Hive 互換パーティションの Amazon S3 などのファイルシステムをスキャンします。このコマンドは、パーティションおよびパーティションに関連付けられたデータに関して、カタログ内のメタデータを更新します。

パーティションを追加または削除すると、カタログ内のメタデータがファイルシステム内のデータのレイアウトと不整合になります。たとえば、パーティションを含むテーブルを作成した後、新しいパーティションに関する情報をカタログに追加する必要があります。メタデータを更新するには、テーブルで MSCK REPAIR TABLE を実行します。これにより、Athena から新しいパーティションのデータをクエリできます。

考慮事項と制約事項

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 table_name

MSCK REPAIR TABLE orders;

トラブルシューティング

MSCK REPAIR TABLE を実行した後、Athena が AWS Glue データカタログ のテーブルにパーティションを追加しない場合は、次の点を確認してください。

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

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

ここで示している各セクションで、さらに詳しく学習できます。

IAM ポリシーで glue:BatchCreatePartition を許可します。

MSCK REPAIR TABLE の実行に使用しているユーザーまたはロールにアタッチされている IAM ポリシーを確認します。Athena で AWS Glue データカタログを使用する場合、IAM ポリシーで glue:BatchCreatePartition アクションを許可する必要があります。glue:BatchCreatePartition アクションを許可する IAM ポリシーの例については、「AmazonAthenaFullAccess 管理ポリシー」を参照してください。

Amazon S3 パスを小文字に変更する

Amazon S3 パスは小文字にする必要があります。S3 パスがキャメルケースの場合、MSCK REPAIR TABLE は AWS Glue データカタログ にパーティションを追加しません。たとえば、S3 パスが userId の場合、次のパーティションは AWS Glue データカタログ に追加されません。

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/