分區(qū)操作
MaxCompute支持對已有表的分區(qū)執(zhí)行變更操作,如添加分區(qū)、刪除分區(qū)、修改分區(qū)值等,您可以根據(jù)實際業(yè)務(wù)場景執(zhí)行相應(yīng)操作。
MaxCompute SQL的分區(qū)操作命令如下。
操作 | 功能 | 角色 | 操作入口 |
為已存在的分區(qū)表新增分區(qū)。 | 具備修改表權(quán)限(Alter)的用戶 | 本文中的命令您可以在如下工具平臺執(zhí)行: | |
修改分區(qū)表中分區(qū)的 | |||
修改分區(qū)表的分區(qū)值。 | |||
對分區(qū)表的分區(qū)進行合并,即同一個分區(qū)表下的多個分區(qū)合并成一個分區(qū),同時刪除被合并的分區(qū)維度的信息,把數(shù)據(jù)移動到指定分區(qū)。 | |||
列出一張表中的所有分區(qū)。 | |||
查看某個分區(qū)表具體的分區(qū)的信息。 | |||
為已存在的分區(qū)表刪除分區(qū)。 | |||
清空指定分區(qū)的數(shù)據(jù)。 |
使用限制
目前支持TINYINT、SMALLINT、INT、BIGINT、CHAR、VARCHAR和STRING數(shù)據(jù)類型的字段設(shè)為分區(qū)列。
單表分區(qū)層級最多6級。
單表分區(qū)數(shù)最多允許60000個分區(qū)。
一次最多查詢分區(qū)數(shù)為10000個。
Transaction類型的分區(qū)表不支持merge partition操作。
Delta Table類型的非分區(qū)表不支持清空操作、不支持更改表的write.bucket.num屬性。
添加分區(qū)
為已存在的分區(qū)表新增分區(qū)。
限制條件
對于有多級分區(qū)的表,如果需要添加新的分區(qū)值,必須指明全部的分區(qū)。
僅支持新增分區(qū)值,不支持新增分區(qū)字段。
命令格式
ALTER TABLE <table_name> ADD [IF NOT EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...];
參數(shù)說明
參數(shù)
是否必填
說明
table_name
是
待新增分區(qū)的分區(qū)表名稱。
IF NOT EXISTS
否
如果未指定IF NOT EXISTS而同名的分區(qū)已存在,會執(zhí)行失敗并返回報錯。
pt_spec
是
新增的分區(qū),格式為:
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。其中partition_col是分區(qū)字段,partition_col_value是分區(qū)值。分區(qū)字段不區(qū)分大小寫,分區(qū)值區(qū)分大小寫。使用示例
關(guān)于sale_detail表創(chuàng)建,詳情請參見創(chuàng)建sale_detail表。
示例1:給表sale_detail添加一個分區(qū),用來存儲2013年12月杭州地區(qū)的銷售記錄。
ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='201312', region='hangzhou');
示例2:給表sale_detail同時添加兩個分區(qū),用來存儲2013年12月北京和上海地區(qū)的銷售記錄。
ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='201312', region='beijing') PARTITION (sale_date='201312', region='shanghai');
示例3:給表sale_detail添加分區(qū),僅指定一個分區(qū)字段sale_date,返回報錯,需要同時指定2個分區(qū)字段sale_date和region。
ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='20111011');
示例4:增加Delta Table表分區(qū)
--創(chuàng)建delta table表 CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL) PARTITIONED BY (dd STRING, hh STRING) TBLPROPERTIES ("transactional"="true"); --添加分區(qū) ALTER TABLE mf_tt ADD PARTITION (dd='01', hh='01');
示例5:修改Delta Table表屬性
--更新bucket數(shù)據(jù),目前只支持分區(qū)表,不支持非分區(qū)表 ALTER TABLE mf_tt3 SET tblproperties("write.bucket.num"="64"); --更新retain屬性 ALTER TABLE mf_tt3 SET tblproperties("acid.data.retain.hours"="60");
修改分區(qū)的更新時間
MaxCompute SQL提供touch
操作,用于修改分區(qū)表中分區(qū)的LastModifiedTime
。此操作會將LastModifiedTime
修改為當前時間。此時,MaxCompute會認為數(shù)據(jù)有變動,重新計算生命周期。
使用限制
對于有多級分區(qū)的表,必須指明全部的分區(qū)。
命令格式
ALTER TABLE <table_name> touch PARTITION (<pt_spec>);
參數(shù)說明
參數(shù)
是否必填
說明
table_name
是
待修改分區(qū)更新時間的分區(qū)表名稱。如果表不存在,則返回報錯。
pt_spec
是
需要修改更新時間的分區(qū)信息。格式為:
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。其中partition_col是分區(qū)字段,partition_col_value是分區(qū)值。如果指定的分區(qū)字段或分區(qū)值不存在,則返回報錯。使用示例
--修改表sale_detail的分區(qū)sale_date='201312', region='shanghai'的LastModifiedTime。 ALTER TABLE sale_detail touch PARTITION (sale_date='201312', region='shanghai');
修改分區(qū)值
MaxCompute SQL支持通過rename
操作更改分區(qū)表的分區(qū)值。
使用限制
不支持修改分區(qū)列的列名,只能修改分區(qū)列對應(yīng)的值。
對于有多級分區(qū)的表,必須指明全部的分區(qū)。
命令格式
ALTER TABLE <table_name> PARTITION (<pt_spec>) rename TO PARTITION (<new_pt_spec>);
參數(shù)說明
參數(shù)
是否必填
說明
table_name
是
待修改分區(qū)值的表名稱。
pt_spec
是
需要修改分區(qū)值的分區(qū)信息。格式為:
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。其中partition_col是分區(qū)字段,partition_col_value是分區(qū)值。如果指定的分區(qū)字段或分區(qū)值不存在,則返回報錯。new_pt_spec
是
修改后的分區(qū)信息。格式為:
(partition_col1 = new_partition_col_value1, partition_col2 = new_partition_col_value2, ...)
。其中partition_col是分區(qū)字段,new_partition_col_value是新分區(qū)值。使用示例
--修改表sale_detail的分區(qū)值。 ALTER TABLE sale_detail PARTITION (sale_date = '201312', region = 'hangzhou') rename TO PARTITION (sale_date = '201310', region = 'beijing');
合并分區(qū)
MaxCompute SQL提供merge partition
對分區(qū)表的分區(qū)進行合并,即將同一個分區(qū)表下的多個分區(qū)合并成一個分區(qū),同時刪除被合并的分區(qū)維度的信息,把數(shù)據(jù)移動到指定分區(qū)。
使用限制
不支持外部表,聚簇表合并后的分區(qū)會消除聚簇屬性。
一次性合并分區(qū)數(shù)量限制為4000個。
命令格式
ALTER TABLE <table_name> MERGE [IF EXISTS] PARTITION (<predicate>) [, PARTITION(<predicate2>) ...] overwrite PARTITION (<fullpartitionSpec>) [purge];
參數(shù)說明
參數(shù)
是否必填
說明
table_name
是
待合并分區(qū)的分區(qū)表名稱。
IF EXISTS
否
如果未指定IF EXISTS,且分區(qū)不存在,會執(zhí)行失敗并返回報錯。如果指定IF EXISTS后不存在滿足
merge
條件的分區(qū),則不生成新分區(qū)。如果運行過程中出現(xiàn)源數(shù)據(jù)被并發(fā)修改(包括insert
、rename
或drop
)時,即使指定IF EXISTS也會報錯。predicate
是
篩選待合并分區(qū)需要滿足的條件。
fullpartitionSpec
是
目標分區(qū)信息。
purge
否
可選關(guān)鍵字。選擇該字段,則會清理session目錄,默認清理3天內(nèi)的日志。詳情請參見Purge。
使用示例
示例1:合并滿足指定條件的分區(qū)到目標分區(qū)。
--查看分區(qū)表的分區(qū)。 SHOW partitions intpstringstringstring; ds=20181101/hh=00/mm=00 ds=20181101/hh=00/mm=10 ds=20181101/hh=10/mm=00 ds=20181101/hh=10/mm=10 --合并所有滿足hh='00'的分區(qū)到hh='00',mm='00'中。 ALTER TABLE intpstringstringstring MERGE PARTITION(hh='00') overwrite PARTITION(ds='20181101', hh='00', mm='00'); --查看合并后的分區(qū)。 SHOW partitions intpstringstringstring; ds=20181101/hh=00/mm=00 ds=20181101/hh=10/mm=00 ds=20181101/hh=10/mm=10
示例2:合并指定的多個分區(qū)到目標分區(qū)。
--合并多個指定分區(qū)。 ALTER TABLE intpstringstringstring MERGE IF EXISTS PARTITION(ds='20181101', hh='00', mm='00'), PARTITION(ds='20181101', hh='10', mm='00'), partition(ds='20181101', hh='10', mm='10') overwrite partition(ds='20181101', hh='00', mm='00') purge; --查看分區(qū)表的分區(qū)。 SHOW partitions intpstringstringstring; ds=20181101/hh=00/mm=00
列出所有分區(qū)
列出一張表中的所有分區(qū)。當表不存在或為非分區(qū)表時,返回報錯。
命令格式
SHOW PARTITIONS <table_name>;
參數(shù)說明
table_name:必填。待查看分區(qū)信息的分區(qū)表名稱。
使用示例
-- 列出sale_detail中的所有分區(qū)。 SHOW PARTITIONS sale_detail;
返回結(jié)果如下。
sale_date=2023/region=china sale_date=2024/region=shanghai
查看分區(qū)信息
查看某個分區(qū)表具體的分區(qū)的信息。
命令格式
DESC <table_name> PARTITION (<pt_spec>);
參數(shù)說明
參數(shù)
是否必填
說明
table_name
是
待查看分區(qū)信息的分區(qū)表名稱。
pt_spec
是
待查看的分區(qū)信息。格式為
partition_col1=col1_value1, partition_col2=col2_value1...
。對于有多級分區(qū)的表,必須指明全部的分區(qū)值。使用示例
--查詢分區(qū)表sale_detail的分區(qū)信息。 DESC sale_detail PARTITION (sale_date='201312',region='hangzhou');
返回結(jié)果如下。
+------------------------------------------------------------------------------------+ | PartitionSize: 1234 | +------------------------------------------------------------------------------------+ | CreateTime: 2024-11-14 16:43:22 | | LastDDLTime: 2024-11-14 16:45:37 | | LastModifiedTime: 2024-11-14 16:45:37 | +------------------------------------------------------------------------------------+ OK
刪除分區(qū)
為已存在的分區(qū)表刪除分區(qū)。
MaxCompute支持通過條件篩選方式刪除分區(qū)。如果您希望一次性刪除符合某個規(guī)則條件的多個分區(qū),可以使用表達式指定篩選條件,通過篩選條件匹配分區(qū)并批量刪除分區(qū)。
限制條件
每個分區(qū)過濾子句只能訪問一個分區(qū)列。
表達式用到的函數(shù)必須是內(nèi)建的Scalar函數(shù)。
注意事項
刪除分區(qū)之后,MaxCompute項目的存儲量會降低。
您可以結(jié)合MaxCompute提供的生命周期功能,實現(xiàn)自動回收舊分區(qū)的能力。更多生命周期信息,請參見生命周期。
命令格式
未指定篩選條件
--一次刪除一個分區(qū)。 ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>; --一次刪除多個分區(qū)。 ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>,PARTITION <pt_spec>[,PARTITION <pt_spec>....];
指定篩選條件
ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <partition_filtercondition>;
參數(shù)說明
參數(shù)
是否必填
說明
table_name
是
待刪除分區(qū)的分區(qū)表名稱。
IF EXISTS
否
如果未指定if exists且分區(qū)不存在,則返回報錯。
pt_spec
是
刪除的分區(qū)。格式為:
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。其中partition_col是分區(qū)字段,partition_col_value是分區(qū)值。分區(qū)字段不區(qū)分大小寫,分區(qū)值區(qū)分大小寫。partition_filtercondition
否
指定篩選條件時必填。分區(qū)篩選條件,不區(qū)分大小寫。格式如下:
partition_filtercondition : PARTITION (<partition_col> <relational_operators> <partition_col_value>) | PARTITION (scalar(<partition_col>) <relational_operators> <partition_col_value>) | PARTITION (<partition_filtercondition1> AND|OR <partition_filtercondition2>) | PARTITION (NOT <partition_filtercondition>) | PARTITION (<partition_filtercondition1>)[,PARTITION (<partition_filtercondition2>), ...]
介紹如下:
partition_col:分區(qū)名稱。
relational_operators:關(guān)系運算符,詳情請參見運算符。
partition_col_value:分區(qū)列比較值或正則表達式,與分區(qū)列數(shù)據(jù)類型保持一致。
scalar():Scalar函數(shù)。Scalar函數(shù)基于輸入值生成對應(yīng)的標量,對分區(qū)列的值(partition_col)進行處理后再按照指定的關(guān)系運算符relational_operators與partition_col_value做比較。
分區(qū)過濾條件支持邏輯運算符NOT、AND和OR。支持通過NOT過濾條件子句,取過濾規(guī)則的補集。支持多個過濾條件子句以AND或OR的關(guān)系組成整體分區(qū)匹配規(guī)則。
支持多個分區(qū)過濾子句,當多個分區(qū)過濾子句以英文逗號(,)分隔時,每個過濾子句的邏輯以O(shè)R的關(guān)系組成整體分區(qū)匹配規(guī)則。
使用示例
未指定篩選條件
--從表sale_detail中刪除一個分區(qū),2013年12月杭州分區(qū)的銷售記錄。 ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='201312',region='hangzhou'); --從表sale_detail中同時刪除兩個分區(qū),2013年12月杭州和上海分區(qū)的銷售記錄。 ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='201312',region='hangzhou'),PARTITION(sale_date='201312',region='shanghai');
指定篩選條件
--創(chuàng)建分區(qū)表 CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) partitioned BY (sale_date STRING); --添加分區(qū) ALTER TABLE sale_detail ADD if NOT EXISTS PARTITION (sale_date= '201910') PARTITION (sale_date= '201911') PARTITION (sale_date= '201912') PARTITION (sale_date= '202001') PARTITION (sale_date= '202002') PARTITION (sale_date= '202003') PARTITION (sale_date= '202004') PARTITION (sale_date= '202005') PARTITION (sale_date= '202006') PARTITION (sale_date= '202007'); --批量刪除分區(qū) ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date >= '202007'); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date LIKE '20191%'); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date IN ('202002','202004','202006')); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date BETWEEN '202001' AND '202007'); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(substr(sale_date, 1, 4) = '2020'); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date < '201912' OR sale_date >= '202006'); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date > '201912' AND sale_date <= '202004'); ALTER TABLE sale_detail DROP IF EXISTS PARTITION(NOT sale_date > '202004'); --支持多個分區(qū)過濾表達式,表達式之間是OR的關(guān)系 ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'), PARTITION(sale_date >= '202007'); --添加其他格式分區(qū) ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date= '2019-10-05') PARTITION (sale_date= '2019-10-06') PARTITION (sale_date= '2019-10-07'); --批量刪除分區(qū),使用正則表達式匹配分區(qū)。 ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date RLIKE '2019-\\d+-\\d+'); --創(chuàng)建多級分區(qū)表。 CREATE TABLE IF NOT EXISTS region_sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) partitioned BY (sale_date STRING , region STRING ); --添加分區(qū)。 ALTER TABLE region_sale_detail ADD IF NOT EXISTS PARTITION (sale_date= '201910',region = 'shanghai') PARTITION (sale_date= '201911',region = 'shanghai') PARTITION (sale_date= '201912',region = 'shanghai') PARTITION (sale_date= '202001',region = 'shanghai') PARTITION (sale_date= '202002',region = 'shanghai') PARTITION (sale_date= '201910',region = 'beijing') PARTITION (sale_date= '201911',region = 'beijing') PARTITION (sale_date= '201912',region = 'beijing') PARTITION (sale_date= '202001',region = 'beijing') PARTITION (sale_date= '202002',region = 'beijing'); --執(zhí)行如下語句批量刪除多級分區(qū),兩個匹配條件是或的關(guān)系,會將sale_date小于201911或region等于beijing的分區(qū)都刪除掉。 ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'),PARTITION(region = 'beijing'); --如果刪除sale_date小于201911且region等于beijing的分區(qū),可以使用如下方法。 ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911', region = 'beijing');
批量刪除多級分區(qū)時,在一個
partition
過濾子句中,不能根據(jù)多個分區(qū)列編寫組合條件匹配分區(qū),如下語句會報錯FAILED: ODPS-0130071:[1,82] Semantic analysis exception - invalid column reference region, partition expression must have one and only one column reference
。--分區(qū)過濾子句只能訪問一個分區(qū)列,如下語句報錯。 ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911' AND region = 'beijing');
清空分區(qū)數(shù)據(jù)
清空分區(qū)表中指定分區(qū)的數(shù)據(jù)。
MaxCompute支持通過條件篩選方式清空分區(qū)數(shù)據(jù)。如果您希望一次性刪除符合某個規(guī)則條件的一個或多個分區(qū),可以使用表達式指定篩選條件,通過篩選條件匹配分區(qū)并批量清空分區(qū)數(shù)據(jù)。
命令格式
未指定篩選條件
TRUNCATE TABLE <table_name> PARTITION <pt_spec>[, PARTITION <pt_spec>....];
指定篩選條件
TRUNCATE TABLE <table_name> PARTITION <partition_filtercondition>;
參數(shù)說明
參數(shù)
是否必填
說明
table_name
是
待清空分區(qū)數(shù)據(jù)的分區(qū)表名稱。
pt_spec
是
待清空數(shù)據(jù)的分區(qū)。格式為:
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。其中partition_col是分區(qū)字段,partition_col_value是分區(qū)值。分區(qū)字段不區(qū)分大小寫,分區(qū)值區(qū)分大小寫。partition_filtercondition
否
指定篩選條件時必填。分區(qū)篩選條件,不區(qū)分大小寫。格式如下:
partition_filtercondition : PARTITION (<partition_col> <relational_operators> <partition_col_value>) | PARTITION (scalar(<partition_col>) <relational_operators> <partition_col_value>) | PARTITION (<partition_filtercondition1> AND|OR <partition_filtercondition2>) | PARTITION (NOT <partition_filtercondition>) | PARTITION (<partition_filtercondition1>)[,PARTITION (<partition_filtercondition2>), ...]
介紹如下:
partition_col:分區(qū)名稱。
relational_operators:關(guān)系運算符,詳情請參見運算符。
partition_col_value:分區(qū)列比較值或正則表達式,與分區(qū)列數(shù)據(jù)類型保持一致。
scalar():Scalar函數(shù)。Scalar函數(shù)基于輸入值生成對應(yīng)的標量,對分區(qū)列的值(partition_col)進行處理后再按照指定的關(guān)系運算符relational_operators與partition_col_value做比較。
分區(qū)過濾條件支持邏輯運算符NOT、AND和OR。支持通過NOT過濾條件子句,取過濾規(guī)則的補集。支持多個過濾條件子句以AND或OR的關(guān)系組成整體分區(qū)匹配規(guī)則。
支持多個分區(qū)過濾子句,當多個分區(qū)過濾子句以英文逗號(,)分隔時,每個過濾子句的邏輯以O(shè)R的關(guān)系組成整體分區(qū)匹配規(guī)則。
使用示例
未指定篩選條件
--從表sale_detail中清空一個分區(qū),清空2013年12月杭州地域的銷售記錄。 TRUNCATE TABLE sale_detail PARTITION(sale_date='201312',region='hangzhou'); --從表sale_detail中同時清空兩個分區(qū),清空2013年12月杭州和上海地域的銷售記錄。 TRUNCATE TABLE sale_detail PARTITION(sale_date='201312',region='hangzhou'), PARTITION(sale_date='201312',region='shanghai');
指定篩選條件
--從表sale_detail中清空多個分區(qū),清空杭州地域下sale_date以2013開頭的銷售記錄。 TRUNCATE TABLE sale_detail PARTITION(sale_date LIKE '2013%' AND region='hangzhou');
清空Delta Table非分區(qū)表
--清空非分區(qū)表,表類型必須為非分區(qū)表, 否則報錯 TRUNCATE TABLE mf_tt2;
相關(guān)文檔
更多關(guān)于表操作命令詳情,請參見: