

# ALTER TABLE ADD PARTITION
<a name="alter-table-add-partition"></a>

テーブルのパーティション列を 1 つ以上作成します。各パーティションは、1 つ以上の異なる列名/値の組み合わせで構成されます。指定した組み合わせごとに別個のデータディレクトリが作成されます。これにより、クエリパフォーマンスが向上する場合があります。パーティション分割された列は、テーブルのデータ自体内には存在しないため、テーブル内の列自体と同じ名前を使用すると、エラーになります。詳細については、「[データのパーティション化](partitions.md)」を参照してください。

Athena では、テーブルとそのパーティションが同じデータ形式を使用する必要がありますが、スキーマは異なる場合があります。詳細については、「」を参照してください[パーティションを使用してテーブルを更新する](updates-and-partitions.md)

IAM ポリシーで必要とされるリソースレベルのアクセス許可 (`glue:CreatePartition` を含む) については、「[AWS Glue API アクセス許可: アクションとリソースのリファレンス](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)」および「[AWS Glue Data Catalog のデータベースとテーブルへのアクセスを構成する](fine-grained-access-to-glue-resources.md)」を参照してください。Athena を使用する際のアクセス許可に関するトラブルシューティングについては、「[アクセス許可](troubleshooting-athena.md#troubleshooting-athena-permissions)」トピックの「[Athena の問題をトラブルシューティングする](troubleshooting-athena.md)」セクションを参照してください。

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

```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION
  (partition_col1_name = partition_col1_value
  [,partition_col2_name = partition_col2_value]
  [,...])
  [LOCATION 'location1']
  [PARTITION
  (partition_colA_name = partition_colA_value
  [,partition_colB_name = partition_colB_value
  [,...])]
  [LOCATION 'location2']
  [,...]
```

## パラメータ
<a name="parameters"></a>

パーティションを追加するときは、パーティションの 1 つ、または複数の列名/値ペアと、そのパーティションのデータファイルが格納されている Amazon S3 パスを指定します。

**[IF NOT EXISTS]**  
同じ定義のパーティションが既に存在する場合、エラーを抑制します。

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
ユーザー指定の列名/値の組み合わせでパーティションを作成します。列のデータ型が文字列である場合に限り、`partition_col_value` を文字列の文字で囲みます。

**[LOCATION 'location']**  
前のステートメントで定義したパーティションの保存先のディレクトリを指定します。データが Hive スタイルのパーティショニング (`pk1=v1/pk2=v2/pk3=v3`) を使用する場合、`LOCATION` 句はオプションです。Hive スタイルのパーティション化では、テーブルの場所、パーティションキー名、およびパーティションキー値からフル Amazon S3 URI が自動的に作成されます。詳細については、「[データのパーティション化](partitions.md)」を参照してください。

## 考慮事項
<a name="alter-table-add-partition-considerations"></a>

Amazon Athena は、単一の `ALTER TABLE ADD PARTITION` DDL ステートメントに追加できるパーティションの数に特定の制限を設定していません。ただし、大量のパーティションを追加する必要がある場合は、パフォーマンス問題が発生する可能性を避けるため、操作を小規模なバッチに分割することを検討してください。以下の例は、連続するコマンドを使用してパーティションを個別に追加し、`IF NOT EXISTS` を使用して重複するパーティションが追加されないようにしています。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-01')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-02')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
```

 Athena でパーティションを使用するときは、以下の点に留意してください。
+ Athena では、1,000 万のパーティションを持つ AWS Glue テーブルへのクエリがサポートされていますが、1 回のスキャンで読み取れるのは、100 万のパーティションまでです。
+ クエリを最適化し、スキャンされるパーティションの数を減らすため、パーティションプルーニングやパーティションインデックスの使用といった戦略を検討してください。

Athena でのパーティションの使用に関するその他の考慮事項については、「[データのパーティション化](partitions.md)」を参照してください。

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

次の例では、Hive スタイルのパーティション化されたデータ用のテーブルに、1 つのパーティションを追加します。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-14', country = 'IN');
```

次の例では、Hive スタイルのパーティション化されたデータ用のテーブルに、複数のパーティションを追加します。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN')
  PARTITION (dt = '2016-06-01', country = 'IN');
```

テーブルが Hive スタイルのパーティション化されたデータ向けのものではない場合は、`LOCATION` 句が必要です。この句は、パーティションのデータが含まれるプレフィックスのフル Amazon S3 URI でなければなりません。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_31_May_2016/'
  PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_01_June_2016/';
```

パーティションがすでに存在する場合にエラーを無視するには、次の例のように `IF NOT EXISTS` 句を使用します。

```
ALTER TABLE orders ADD IF NOT EXISTS
  PARTITION (dt = '2016-05-14', country = 'IN');
```

## ゼロバイト `_$folder$` ファイル
<a name="alter-table-add-partition-zero-byte-folder-files"></a>

`ALTER TABLE ADD PARTITION` ステートメントを実行し、すでに存在するパーティションと正しくない Amazon S3 の場所を誤って指定すると、形式 `partition_value_$folder$` のゼロバイトプレースホルダーが Amazon S3 に作成されます。これらのファイルは手動で削除する必要があります。

これを防ぐには、次の例のように、`ALTER TABLE ADD PARTITION` ステートメントで `ADD IF NOT EXISTS` 構文を使用します。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]
```