ALTER TABLE ADD PARTITION
为表创建一个或多个分区列。每个分区包含一个或多个不同的列名称/值组合。将会为每个指定的组合创建一个单独的数据目录,这在某些情况下可提高查询性能。分区列在表数据本身中不存在,因此如果您使用的列名称与表本身的列同名,则会出现错误。有关更多信息,请参阅 对您的数据进行分区。
在 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 是根据表的位置、分区键名称和分区键值自动构造的。有关更多信息,请参阅 对您的数据进行分区。
注意事项
Amazon Athena 并未对可以在单个 ALTER TABLE ADD PARTITION
DDL 语句中添加的分区数量施加具体限制。不过,若是需要添加大量分区,可考虑多分几次进行添加,避免性能存在潜在问题。以下示例使用连续命令来分别添加分区,同时使用 IF NOT EXISTS
来避免添加重复分区。
ALTER TABLE
table_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-01') ALTER TABLEtable_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-02') ALTER TABLEtable_name
ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
在 Athena 中使用分区时,还请记住以下几点:
-
尽管 Athena 支持查询具有 1000 万个分区的 Amazon Glue 表,但 Athena 的单次扫描读取量最多为 100 万个分区。
-
要优化查询并减少扫描的分区数量,可考虑分区修剪或使用分区索引等策略。
有关在 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://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$
文件
如果您运行 ALTER TABLE ADD PARTITION
语句并错误地指定了已存在的分区和错误的 Simple Storage Service (Amazon S3) 位置,格式为
的零字节占位符文件将在 Simple Storage Service (Amazon S3) 中创建。您必须手动移除这些文件。partition_value
_$folder$
为了防止这种情况发生,在 ALTER TABLE ADD PARTITION
语句中使用 ADD IF NOT EXISTS
语法,如以下示例所示。
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]