ALTER TABLE ADD PARTITION - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

ALTER TABLE ADD PARTITION

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

在 Athena 中,一个表及其分区必须使用相同的数据格式,但它们的架构可以不同。有关更多信息,请参阅 包含分区的表中的更新

有关 IAM 策略中需要的资源级权限(包括 glue:CreatePartition),请参阅 Amazon Glue API 权限:操作和资源参考以及 针对 Amazon Glue Data Catalog 中数据库和表的精细访问权限。有关使用 Athena 时权限相关的疑难解答信息,请参阅 在 Athena 中进行故障排除 主题的 权限 部分。

摘要

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'] [,...]

参数

添加分区时,您可以为分区指定一个或多个列名/值对,以及该分区的数据文件所在的 Amazon S3 路径。

[IF NOT EXISTS]

如果已存在具有相同定义的分区,则会导致错误被隐藏。

PARTITION (partition_col_name = partition_col_value [,...])

创建一个具有指定列名称/值组合的分区。仅当列的数据类型为字符串时,才将 partition_col_value 包含在字符串字符中。

[LOCATION 'location']

指定存储前述语句所定义的分区的目录。当数据使用 Hive 样式分区 (pk1=v1/pk2=v2/pk3=v3) 时,LOCATION 子句为可选项。在 Hive 式分区中,完整的 Amazon S3 URI 是根据表的位置、分区键名称和分区键值自动构造的。有关更多信息,请参阅 在 Athena 中对数据进行分区

注意事项

Amazon Athena 不会对你可以在单个 DDL 语句中添加的分区数量施加具体限制。ALTER TABLE ADD PARTITION但是,如果您需要添加大量分区,请考虑将操作分成较小的批次以避免潜在的性能问题。以下示例使用连续的命令来单独添加分区,并使用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 支持 Amazon Glue 查询具有 1000 万个分区的表,但是 Athena 在一次扫描中读取的分区不能超过 100 万个。

  • 要优化查询并减少扫描的分区数量,请考虑诸如分区修剪或使用分区索引之类的策略。

  • 如果您不使用 Amazon Glue Data Catalog,则每张表的最大分区数为 20,000。您可以请求提高限额。

有关在 Athena 中使用分区的其他注意事项,请参阅。在 Athena 中对数据进行分区

示例

以下示例将单个分区添加至 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://mystorage/path/to/INDIA_31_May_2016/' PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://mystorage/path/to/INDIA_01_June_2016/';

要在已存在分区时忽略错误,使用 IF NOT EXISTS 子句,如以下示例所示。

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

零字节 _$folder$ 文件

如果您运行 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 […]