

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

为表创建一个或多个分区列。每个分区包含一个或多个不同的列名称/值组合。将会为每个指定的组合创建一个单独的数据目录，这在某些情况下可提高查询性能。分区列在表数据本身中不存在，因此如果您使用的列名称与表本身的列同名，则会出现错误。有关更多信息，请参阅 [对您的数据进行分区](partitions.md)。

在 Athena 中，一个表及其分区必须使用相同的数据格式，但它们的架构可以不同。有关更多信息，请参阅 [更新包含分区的表](updates-and-partitions.md)。

有关 IAM 策略中需要的资源级权限（包括 `glue:CreatePartition`），请参阅 [Amazon Glue API 权限：操作和资源参考](https://docs.amazonaws.cn/glue/latest/dg/api-permissions-reference.html)以及 [在 Amazon Glue Data Catalog 中配置对数据库和表的访问](fine-grained-access-to-glue-resources.md)。有关使用 Athena 时权限相关的疑难解答信息，请参阅 [在 Athena 中进行排查问题](troubleshooting-athena.md) 主题的 [权限](troubleshooting-athena.md#troubleshooting-athena-permissions) 部分。

## 摘要
<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>

添加分区时，您可以为分区指定一个或多个列名/值对，以及该分区的数据文件所在的 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 支持查询具有 1000 万个分区的 Amazon Glue 表，但 Athena 的单次扫描读取量最多为 100 万个分区。
+ 要优化查询并减少扫描的分区数量，可考虑分区修剪或使用分区索引等策略。

有关在 Athena 中使用分区的其他注意事项，请参阅 [对您的数据进行分区](partitions.md)。

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

以下示例将单个分区添加至 Hive 样式分区数据表。

```
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` 语句并错误地指定了已存在的分区和错误的 Simple Storage Service (Amazon S3) 位置，格式为 `partition_value_$folder$` 的零字节占位符文件将在 Simple Storage Service (Amazon S3) 中创建。您必须手动移除这些文件。

为了防止这种情况发生，在 `ALTER TABLE ADD PARTITION` 语句中使用 `ADD IF NOT EXISTS` 语法，如以下示例所示。

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