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
を実行します。詳細については、「ALTER TABLE DROP
PARTITION」を参照してください。table-name
DROP
PARTITION
考慮事項と制限事項
MSCK REPAIR TABLE
を使用する際は、次のポイントに注意が必要です。
-
すべてのパーティションを追加するには時間がかかる場合があります。このオペレーションがタイムアウトになると、未完了状態となり、一部のパーティションのみがカタログに追加されます。すべてのパーティションが追加されるまで、同じテーブルで
MSCK REPAIR TABLE
を実行してください。詳細については、「データのパーティション化」を参照してください。 -
Hive と互換性のないパーティションの場合、ALTER TABLE ADD PARTITION を使用してパーティションをロードすることで、データをクエリできるようにします。
-
Athena で使用されるパーティションの場所は、
s3
プロトコル (s3://amzn-s3-demo-bucket/
など) を使用する必要があります。Athena では、他のプロトコル (folder
/s3a://
など) を使用する場所は、そこにあるテーブルに対してbucket
/folder
/MSCK REPAIR TABLE
クエリを実行する場合にクエリが失敗する原因になります。 -
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
の実行後、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 GlueCreateTable
API コール、または AWS CloudFormation テンプレートの一部として指定します。TableType
に使用できる値には、EXTERNAL_TABLE
やVIRTUAL_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://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 ユーザーガイド」の「オブジェクトキー命名ガイドライン」と「バケット命名規則」を参照してください。