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 操作や CloudFormation
AWS::Glue::Tableテンプレートを使用して、TableTypeプロパティを指定せずに Athena で使用するテーブルを作成し、SHOW CREATE TABLEまたはMSCK REPAIR TABLEなどの DDL クエリを実行すると、「失敗: NullPointerException 名は null です」というエラーメッセージを受け取る場合があります。このエラーを解決するには、TableInput
TableType属性の値を AWS GlueCreateTableAPI コール、または CloudFormation テンプレートの一部として指定します。TableTypeに使用できる値には、EXTERNAL_TABLEやVIRTUAL_VIEWが含まれます。この要件は、AWS Glue
CreateTableAPI 操作や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 ユーザーガイド」の「オブジェクトキー命名ガイドライン」と「バケット命名規則」を参照してください。