全部產品
Search
文件中心

MaxCompute:分區操作

更新時間:Jan 22, 2026

MaxCompute支援對已有表的分區執行變更操作,如添加分區、刪除分區、修改分區值等,可以根據實際業務情境執行相應操作。

功能索引

MaxCompute SQL的分區操作命令如下。

操作

功能

角色

操作入口

添加分區

為已存在的分區表新增分區。

具備修改表許可權(Alter)的使用者

本文中的命令可以在如下工具平台執行:

修改分區的更新時間

修改分區表中分區的LastModifiedTime

修改分區值

修改分區表的分區值。

合并分區

對分區表的分區進行合并,即同一個分區表下的多個分區合并成一個分區,同時刪除被合并的分區維度資訊,並將資料移動到指定分區。

列出所有分區

列出一張表中的所有分區。

查看分區資訊

查看某個分區表具體的分區的資訊。

刪除分區

為已存在的分區表刪除分區。

清空分區資料

清空指定分區的資料。

適用範圍

  • 資料類型:目前支援將TINYINT、SMALLINT、INT、BIGINT、CHAR、VARCHAR和STRING資料類型的欄位設為分區列。

  • 單表分區層級最多6級。

  • 單表分區數最多允許60000個分區。

  • 一次最多查詢分區數為10000個。

  • Transaction類型的分區表不支援merge partition操作。

添加分區

為已存在的分區表新增分區。

  • 限制條件

    • 對於有多級分區的表,如果需要添加新的分區值,必須指明全部的分區。

    • 僅支援新增分區值,不支援新增分區欄位。

  • 命令格式

    ALTER TABLE <table_name> ADD [IF NOT EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...];
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待新增分區的分區表名稱。

    IF NOT EXISTS

    如果未指定IF NOT EXISTS而同名的分區已存在,會執行失敗並返回報錯。

    pt_spec

    新增的分區,格式為:(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。其中partition_col是分區欄位,partition_col_value是分區值。分區欄位不區分大小寫,分區值區分大小寫。

  • 使用樣本

    建立普通分區表sale_detail,建立和刪除表,詳情請參見建立和刪除表

    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE)
    PARTITIONED BY (sale_date STRING, region STRING);
    • 樣本1:給表sale_detail添加一個分區,用來儲存2025年12月杭州地區的銷售記錄。

      ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='hangzhou');
    • 樣本2:給表sale_detail同時添加兩個分區,用來儲存2025年12月北京和上海地區的銷售記錄。

      ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='beijing') PARTITION (sale_date='202512', region='shanghai');
    • 樣本3:給表sale_detail添加分區,僅指定一個分區欄位sale_date,返回報錯,需要同時指定2個分區欄位sale_dateregion

      ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='20260111');
      
      -- 錯誤資訊如下:
      FAILED: ODPS-0130071:[1,58] Semantic analysis exception - provided partition spec does not match table partition spec
    • 樣本4:增加Delta Table表分區

      -- 建立Delta Table表
      CREATE TABLE delta_table_test_par (
        pk BIGINT NOT NULL PRIMARY KEY, 
        val BIGINT NOT NULL) 
        PARTITIONED BY (dd STRING, hh STRING) 
        TBLPROPERTIES ("transactional"="true"); 
                   
      -- 添加分區           
      ALTER TABLE delta_table_test_par ADD PARTITION (dd='01', hh='01');
      
      CREATE TABLE delta_table_test_nonpar (
        pk BIGINT NOT NULL PRIMARY KEY, 
        val BIGINT NOT NULL) 
        TBLPROPERTIES ("transactional"="true");
    • 樣本5:修改PK Delta Table表屬性

      -- PK Delta Table分區表更新bucket數。
      ALTER TABLE delta_table_test_par SET tblproperties("write.bucket.num"="64");
      
      -- PK Delta Table非分區表更新bucket數,修改後存量資料會按照新bucket數重新分配。
      ALTER TABLE delta_table_test_nonpar REWRITE tblproperties("write.bucket.num"="128");
      
      -- 更新retain屬性,表示TimeTravel可查詢資料歷史狀態的時間範圍(單位為小時)。
      ALTER TABLE delta_table_test_par SET tblproperties("acid.data.retain.hours"="60");

修改分區的更新時間

MaxCompute SQL提供touch操作,用於修改分區表中分區的LastModifiedTime。此操作會將LastModifiedTime修改為目前時間。此時,MaxCompute會認為資料有變動,重新計算生命週期。

  • 使用限制

    對於有多級分區的表,必須指明全部的分區。

  • 命令格式

    ALTER TABLE <table_name> touch PARTITION (<pt_spec>);
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改分區更新時間的分區表名稱。如果表不存在,則返回報錯。

    pt_spec

    需要修改更新時間的分區資訊。格式為:(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。其中partition_col是分區欄位,partition_col_value是分區值。如果指定的分區欄位或分區值不存在,則返回報錯。

  • 使用樣本

    -- 修改表sale_detail的分區sale_date='202512', region='shanghai'的LastModifiedTime。
    ALTER TABLE sale_detail touch PARTITION (sale_date='202512', region='shanghai');

修改分區值

MaxCompute SQL支援通過rename操作更改分區表的分區值。

  • 使用限制

    • 不支援修改分區列的列名,只能修改分區列對應的值。

    • 對於有多級分區的表,必須指明全部的分區。

  • 命令格式

    ALTER TABLE <table_name> PARTITION (<pt_spec>) rename TO PARTITION (<new_pt_spec>);
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改分區值的表名稱。

    pt_spec

    需要修改分區值的分區資訊。格式為:(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。其中partition_col是分區欄位,partition_col_value是分區值。如果指定的分區欄位或分區值不存在,則返回報錯。

    new_pt_spec

    修改後的分區資訊。格式為:(partition_col1 = new_partition_col_value1, partition_col2 = new_partition_col_value2, ...)。其中partition_col是分區欄位,new_partition_col_value是新分區值。

  • 使用樣本

    -- 修改表sale_detail的分區值。
    ALTER TABLE sale_detail PARTITION (sale_date = '201312', region = 'hangzhou') rename TO PARTITION (sale_date = '201310', region = 'beijing');

合并分區

MaxCompute SQL提供merge partition合并分區表的分區,即將同一個分區表下的多個分區合并成一個分區,同時刪除被合并的分區維度資訊,把資料移動到指定分區。

  • 使用限制

    • 不支援外部表格,聚簇表合并後的分區會消除聚簇屬性。

    • 一次性合并分區數量限制為4000個。

  • 命令格式

    ALTER TABLE <table_name> MERGE [IF EXISTS] PARTITION (<predicate>) [, PARTITION(<predicate2>) ...] overwrite PARTITION (<fullpartitionSpec>) [purge];
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待合并分區的分區表名稱。

    IF EXISTS

    如果未指定IF EXISTS,且分區不存在,會執行失敗並返回報錯。如果指定IF EXISTS後不存在滿足merge條件的分區,則不產生新分區。如果運行過程中出現來源資料被並發修改(包括insertrenamedrop)時,即使指定IF EXISTS也會報錯。

    predicate

    篩選待合并分區需要滿足的條件。

    fullpartitionSpec

    目標資料分割資訊。

    purge

    可選關鍵字。選擇該欄位,則會清理session目錄,預設清理3天內的日誌。詳情請參見Purge

  • 使用樣本

    • 樣本1:合并滿足指定條件的分區到目標資料分割。

      -- 查看分區表的分區。
      SHOW PARTITIONS sale_detail;
      
      -- 樣本返回結果:
      sale_date=202512/region=beijing
      sale_date=202512/region=shanghai
      sale_date=202602/region=beijin
      
      --合并所有滿足sale_date='201512'的分區到sale_date='202601',region='hangzhou'中。
      ALTER TABLE sale_detail MERGE PARTITION(sale_date='202512') overwrite PARTITION(sale_date='202601', region='hangzhou');
      
      --查看合并後的分區。
      SHOW PARTITIONS sale_detail;
      
      -- 樣本返回結果:
      sale_date=202601/region=hangzhou
      sale_date=202602/region=beijing                   
    • 樣本2:合并指定的多個分區到目標資料分割。

      -- 合并多個指定分區。
      ALTER TABLE sale_detail MERGE IF EXISTS 
        PARTITION(sale_date='202601', region='hangzhou'), 
        PARTITION(sale_date='202602', region='beijing') 
        overwrite PARTITION(sale_date='202603', region='shanghai') purge;
      
      -- 查看分區表的分區。
      SHOW PARTITIONS sale_detail;
      
      -- 樣本返回結果:
      sale_date=202603/region=shanghai

列出所有分區

列出一張表中的所有分區。當表不存在或為非分區表時,返回報錯。

  • 命令格式

    SHOW PARTITIONS <table_name>; 
  • 參數說明

    table_name:必填。待查看分區資訊的分區表名稱。

  • 使用樣本

    -- 列出sale_detail中的所有分區。
    SHOW PARTITIONS sale_detail;
    
    -- 樣本返回結果:
    sale_date=202603/region=shanghai

查看分區資訊

查看某個分區表具體的分區的資訊。

  • 命令格式

    DESC <table_name> PARTITION (<pt_spec>);
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待查看分區資訊的分區表名稱。

    pt_spec

    待查看的分區資訊。格式為partition_col1=col1_value1, partition_col2=col2_value1...。對於有多級分區的表,必須指明全部的分區值。

  • 使用樣本

    -- 查詢分區表sale_detail的分區資訊。
    DESC sale_detail PARTITION (sale_date='202603',region='shanghai');
    -- 返回結果如下:
    +------------------------------------------------------------------------------------+
    | PartitionSize: 0                                                                   |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2026-01-13 11:35:49                                      |
    | LastDDLTime:              2026-01-13 11:35:49                                      |
    | LastModifiedTime:         2026-01-13 11:35:49                                      |
    +------------------------------------------------------------------------------------+
    
    OK

刪除分區

為已存在的分區表刪除分區。

MaxCompute支援通過條件式篩選方式刪除分區。如果希望一次性刪除符合某個規則條件的多個分區,可以使用運算式指定篩選條件,通過篩選條件匹配分區並大量刪除分區。

  • 限制條件

    • 每個分區過濾子句只能訪問一個分區列。

    • 運算式用到的函數必須是內建的Scalar函數。

  • 注意事項

    • 刪除分區之後,MaxCompute專案的儲存量會降低。

    • 結合MaxCompute提供的生命週期功能,能夠實現自動回收舊分區。

  • 命令格式

    • 未指定篩選條件

      -- 一次刪除一個分區。
      ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>;
      -- 一次刪除多個分區。
      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>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待刪除分區的分區表名稱。

    IF EXISTS

    如果未指定IF EXISTS且分區不存在,則返回報錯。

    pt_spec

    刪除的分區。格式為:(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。其中partition_col是分區欄位,partition_col_value是分區值。分區欄位不區分大小寫,分區值區分大小寫。

    partition_filtercondition

    指定篩選條件時必填。分區篩選條件,不區分大小寫。格式如下:

    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:分區名稱。

    • relational_operators:關係運算子,詳情請參見運算子

    • partition_col_value:分區列比較值或Regex,與分區列資料類型保持一致。

    • scalar():Scalar函數。Scalar函數基於輸入值產生對應的標量,對分區列的值(partition_col)進行處理後再按照指定的關係運算子relational_operatorspartition_col_value做比較。

    • 分區過濾條件支援邏輯運算子NOT、AND和OR。支援通過NOT過濾條件子句,取過濾規則的補集。支援多個過濾條件子句以AND或OR的關係組成整體分區匹配規則。

    • 支援多個分區過濾子句,當多個分區過濾子句以英文逗號(,)分隔時,每個過濾子句的邏輯以OR的關係組成整體分區匹配規則。

  • 使用樣本

    • 未指定篩選條件

      -- 從表sale_detail中刪除一個分區,2026年3月上海分區的銷售記錄。
      ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202603',region='shanghai'); 
      -- 從表sale_detail中同時刪除兩個分區,2024年12月杭州和上海分區的銷售記錄。
      ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202412',region='hangzhou'),PARTITION(sale_date='202412',region='shanghai');
    • 指定篩選條件

      • 分區表

        -- 建立分區表
        CREATE TABLE IF NOT EXISTS sale_detail_del(
        shop_name     STRING,
        customer_id   STRING,
        total_price   DOUBLE)
        partitioned BY (sale_date STRING);
        
        -- 添加分區
        ALTER TABLE sale_detail_del 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');
        
        -- 大量刪除分區
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911');
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date >= '202007');
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date LIKE '20191%');
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date IN ('202002','202004','202006'));
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date BETWEEN '202001' AND '202007');
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(substr(sale_date, 1, 4) = '2020');
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201912' OR sale_date >= '202006');
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date > '201912' AND sale_date <= '202004');
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(NOT sale_date > '202004');
        
        -- 支援多個分區過濾運算式,運算式之間是OR的關係
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911'), PARTITION(sale_date >= '202007');
        
        -- 添加其他格式分區
        ALTER TABLE sale_detail_del ADD IF NOT EXISTS
        PARTITION (sale_date= '2019-10-05') 
        PARTITION (sale_date= '2019-10-06') 
        PARTITION (sale_date= '2019-10-07');
        
        -- 大量刪除分區,使用Regex匹配分區。
        ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date RLIKE '2019-\\d+-\\d+');
      • 多級分區表

        -- 建立多級分區表
        CREATE TABLE IF NOT EXISTS region_sale_detail(
        shop_name     STRING,
        customer_id   STRING,
        total_price   DOUBLE)
        partitioned BY (sale_date STRING , region STRING );
        
        -- 添加分區
        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');
        
        -- 執行如下語句大量刪除多級分區,兩個匹配條件是或的關係,會將sale_date小於201911或region等於beijing的分區都刪除掉。
        ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'),PARTITION(region = 'beijing');
        
        -- 如果刪除sale_date小於201911且region等於beijing的分區,可以使用如下方法。
        ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911', region = 'beijing');

        大量刪除多級分區時,在一個partition過濾子句中,不能根據多個分區列編寫組合條件匹配分區,如下語句會報錯FAILED: ODPS-0130071:[1,82] Semantic analysis exception - invalid column reference region, partition expression must have one and only one column reference

        -- 分區過濾子句只能訪問一個分區列,如下語句報錯。
        ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911' AND region = 'beijing');

清空分區資料

清空分區表中指定分區的資料。

MaxCompute支援通過條件式篩選方式清空分區資料。如果您希望一次性刪除符合某個規則條件的一個或多個分區,可以使用運算式指定篩選條件,通過篩選條件匹配分區並批量清空分區資料。

  • 命令格式

    • 未指定篩選條件

      TRUNCATE TABLE <table_name> PARTITION <pt_spec>[, PARTITION <pt_spec>....];
    • 指定篩選條件

      TRUNCATE TABLE <table_name> PARTITION <partition_filtercondition>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待清空分區資料的分區表名稱。

    pt_spec

    待清空資料的分區。格式為:(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。其中partition_col是分區欄位,partition_col_value是分區值。分區欄位不區分大小寫,分區值區分大小寫。

    partition_filtercondition

    指定篩選條件時必填。分區篩選條件,不區分大小寫。格式如下:

    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:分區名稱。

    • relational_operators:關係運算子,詳情請參見運算子

    • partition_col_value:分區列比較值或Regex,與分區列資料類型保持一致。

    • scalar():Scalar函數。Scalar函數基於輸入值產生對應的標量,對分區列的值(partition_col)進行處理後再按照指定的關係運算子relational_operatorspartition_col_value做比較。

    • 分區過濾條件支援邏輯運算子NOT、AND和OR。支援通過NOT過濾條件子句,取過濾規則的補集。支援多個過濾條件子句以AND或OR的關係組成整體分區匹配規則。

    • 支援多個分區過濾子句,當多個分區過濾子句以英文逗號(,)分隔時,每個過濾子句的邏輯以OR的關係組成整體分區匹配規則。

  • 使用樣本

    • 未指定篩選條件

      -- 從表sale_detail中清空一個分區,清空2026年01月杭州地區的銷售記錄。
      TRUNCATE TABLE sale_detail PARTITION(sale_date='202601',region='hangzhou');
      
      -- 從表sale_detail中同時清空兩個分區,清空2025年12月杭州和上海地區的銷售記錄。
      TRUNCATE TABLE sale_detail PARTITION(sale_date='202512',region='hangzhou'),  PARTITION(sale_date='202512',region='shanghai');
    • 指定篩選條件

      -- 從表sale_detail中清空多個分區,清空杭州地區下sale_date以2025開頭的銷售記錄。
      TRUNCATE TABLE sale_detail PARTITION(sale_date LIKE '2025%' AND region='hangzhou');
    • 清空Delta Table非分區表

      -- 清空非分區表,表類型必須為非分區表, 否則報錯
      TRUNCATE TABLE non_par_table; 

相關文檔

更多關於表操作命令詳情,請參見: