

# MSCK REPAIR TABLE
<a name="msck-repair-table"></a>

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](alter-table-drop-partition.md)」を参照してください。

## 考慮事項と制限事項
<a name="msck-repair-table-considerations"></a>

`MSCK REPAIR TABLE` を使用する際は、次のポイントに注意が必要です。
+ すべてのパーティションを追加するには時間がかかる場合があります。このオペレーションがタイムアウトになると、未完了状態となり、一部のパーティションのみがカタログに追加されます。すべてのパーティションが追加されるまで、同じテーブルで `MSCK REPAIR TABLE` を実行してください。詳細については、「[データのパーティション化](partitions.md)」を参照してください。
+ Hive と互換性のないパーティションの場合、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) を使用してパーティションをロードすることで、データをクエリできるようにします。
+ Athena で使用されるパーティションの場所は、`s3` プロトコル (`s3://amzn-s3-demo-bucket/{{folder}}/` など) を使用する必要があります。Athena では、他のプロトコル (`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](alter-table-add-partition.md) を使用します。
+ `MSCK REPAIR TABLE` では、アンダースコア (\_) で始まるパーティション列名は追加されません。この制限を回避するには、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) を使用します。

## 概要
<a name="synopsis"></a>

```
MSCK REPAIR TABLE table_name
```

## 例
<a name="examples"></a>

```
MSCK REPAIR TABLE orders;
```

## トラブルシューティング
<a name="msck-repair-table-troubleshooting"></a>

`MSCK REPAIR TABLE` の実行後、AWS Glue Data Catalog のテーブルにパーティションが追加されない場合は、以下をチェックしてください。
+ **AWS Glue アクセス** – AWS Identity and Access Management (IAM) ロールに、`glue:BatchCreatePartition` アクションを許可するポリシーがあることを確認します。詳細については、このドキュメントで後述する「[IAM ポリシーで glue:BatchCreatePartition を許可する](#msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy)」を参照してください。
+ **Amazon S3 アクセス** – ロールに [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html) アクションを含む Amazon S3 にアクセスするために、十分なアクセス許可を持つポリシーがあることを確認します。許可する Simple Storage Service (Amazon S3) アクションの例については、「[Athena で Amazon S3 バケットへのクロスアカウント アクセスを構成する](cross-account-permissions.md)」のバケットポリシー例を参照してください。
+ **Amazon S3 オブジェクトキーの大文字と小文字の区別** – Amazon S3 パスがキャメルケースではなく小文字になっている (例: `userId` ではなく `userid`) ことを確認するか、`ALTER TABLE ADD PARTITION` を使用してオブジェクトキー名を指定します。詳細については、このドキュメントで後述する「[Amazon S3 パスを変更するか再度定義する](#msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path)」を参照してください。
+ **クエリのタイムアウト** – `MSCK REPAIR TABLE` は、初めてテーブルを作成する場合、またはデータとパーティションメタデータ間のパリティについて不確実性がある場合の使用に最適です。`MSCK REPAIR TABLE` を使用して新しいパーティションを頻繁に追加し (例えば、日常的に追加するなど)、クエリのタイムアウトが発生している場合は、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) の使用を検討してください。
+ **ファイルシステムからパーティションが欠落している** – Amazon S3 でパーティションを手動で削除してから `MSCK REPAIR TABLE` を実行すると、「Partitions missing from filesystem」というエラーメッセージが表示される場合があります。これは、`MSCK REPAIR TABLE` がテーブルメタデータから古いパーティションを削除しないために発生します。削除済みのパーティションをテーブルメタデータから除外するには、代わりに [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md) を実行します。[SHOW PARTITIONS](show-partitions.md) も同様に、ファイルシステムのパーティションではなく、メタデータのパーティションだけをリストすることに注意してください。
+ **「NullPointerException 名は null です」というエラー**

  AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作や CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) テンプレートを使用して、`TableType` プロパティを指定せずに Athena で使用するテーブルを作成し、`SHOW CREATE TABLE` または `MSCK REPAIR TABLE` などの DDL クエリを実行すると、「失敗: NullPointerException 名は null です」というエラーメッセージを受け取る場合があります。

  このエラーを解決するには、[TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 属性の値を AWS Glue `CreateTable` API コール、または [CloudFormation テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)の一部として指定します。`TableType` に使用できる値には、`EXTERNAL_TABLE` や `VIRTUAL_VIEW` が含まれます。

  この要件は、AWS Glue `CreateTable` API 操作や `AWS::Glue::Table` テンプレートを使用してテーブルを作成する場合にだけ適用されます。DDL ステートメントや AWS Glue クローラを使用して Athena のテーブルを作成すると、`TableType` プロパティが自動的に定義されます。

以下のセクションで詳細を説明します。

### IAM ポリシーで glue:BatchCreatePartition を許可する
<a name="msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy"></a>

`MSCK REPAIR TABLE` の実行に使用しているロールにアタッチされている IAM ポリシーを見直します。[Athena で AWS Glue Data Catalog を使用](data-sources-glue.md)する場合は、IAM ポリシーで `glue:BatchCreatePartition` アクションが許可されている必要があります。`glue:BatchCreatePartition` アクションを許可する IAM ポリシーの例については、「[AWS 管理ポリシー: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)」を参照してください。

### Amazon S3 パスを変更するか再度定義する
<a name="msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path"></a>

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-add-partition.md) を使用して場所を再度定義します。

  ```
  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 ユーザーガイド」の「[オブジェクトキー命名ガイドライン](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines)」と「[バケット命名規則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)」を参照してください。