全部產品
Search
文件中心

MaxCompute:ALTER TABLE

更新時間:Dec 25, 2025

修改表操作。

使用限制

表結構變更(Schema Evolution)包括對現有表新增複雜資料類型列、刪除列、修改列順序和修改列的資料類型。在下列情境中,如果執行了更改表的列順序、添加新列並修改列順序或刪除列這三種操作,會使表的讀寫行為發生變化,且存在以下限制:

  • 作業類型是MapReduce 1.0時,Graph任務無法讀寫修改表。

  • CUPID作業只有Spark以下版本可以讀表,但是不可以寫表:

    • Spark-2.3.0-odps0.34.0

    • Spark-3.1.1-odps0.34.0

  • PAI作業可以讀表,但不可以寫表。

  • Hologres作業在1.3版本之前,Hologres引用修改的表作為外部表格時,無法讀寫該表。

  • 如果發生表結構變更,則不支援CLONE TABLE

  • 如果發生表結構變更,則使用Streaming Tunnel會報錯。

修改表的所有人

修改表的所有人,即表Owner。

  • 命令格式

    ALTER TABLE <table_name> changeowner TO <new_owner>;
  • 參數說明

    • table_name:必填。待修改Owner的表名。

    • new_owner:必填。修改後的Owner帳號。

  • 使用樣本

    -- 將表test1的所有人修改為ALIYUN$xxx@aliyun.com。
    ALTER TABLE test1 changeowner TO 'ALIYUN$xxx@aliyun.com';

修改表的注釋

修改表的注釋內容。

  • 命令格式

    ALTER TABLE <table_name> SET COMMENT '<new_comment>';
  • 參數說明

    • table_name:必填。待修改注釋的表的名稱。

    • new_comment:必填。修改後的注釋內容。

  • 使用樣本

    ALTER TABLE sale_detail SET COMMENT 'new comments for table sale_detail';

    可以通過MaxCompute的DESC <table_name>命令查看錶中COMMENT的修改結果。

修改表的修改時間

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

  • 命令格式

    ALTER TABLE <table_name> touch;
  • 參數說明

    table_name:必填。待修改表的修改時間的表名稱。

  • 使用樣本

    ALTER TABLE sale_detail touch;

修改表的聚簇屬性

對於分區表,MaxCompute支援通過ALTER TABLE語句增加或者去除聚簇屬性。

  • 命令格式

    • 增加表的Hash聚簇屬性的文法格式如下:

      ALTER TABLE <table_name> [clustered BY (<col_name> [, <col_name>, ...]) [sorted BY (<col_name> [ASC | DESC] 
        [, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> buckets];
    • 去除表的Hash聚簇屬性的文法格式如下:

      ALTER TABLE <table_name> NOT clustered;
    • 增加表的Range聚簇屬性,Bucket數不是必須的,可以省略,此時系統會根據資料量自動決定最佳的Bucket數目。文法格式如下:

      ALTER TABLE <table_name> [RANGE clustered BY (<col_name> [, <col_name>, ...]) [sorted BY (<col_name> [ASC | DESC] 
        [, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> buckets];
    • 去除表或分區的Range聚簇屬性的文法格式如下:

      ALTER TABLE <table_name> NOT clustered;
      ALTER TABLE <table_name> PARTITION [<pt_spec>] NOT clustered;
      說明
      • 通過ALTER TABLE改變聚簇屬性,只對分區表有效,非分區表一旦建立聚簇屬性就無法改變ALTER TABLE語句適用於存量表,在增加了新的聚簇屬性後,新的分區將按設定的聚簇屬性儲存區。

      • ALTER TABLE只會影響分區表的建立分區(包括INSERT OVERWEITE產生的),新分區將按新的聚簇屬性儲存區,老資料分區的聚簇屬性和儲存保持不變。即在一張曾經做過聚簇屬性設定的表上,關閉了聚簇屬性,再增加聚簇設定,可以在新分區設定不同於之前的聚簇列、排序列及分桶數。

      • 由於ALTER TABLE隻影響新分區,所以該語句不可以再指定分區。

  • 參數說明

    參數與CREATE TABLE一致。

  • 使用樣本

    -- 建立一個分區表。
    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE)
    partitioned BY (sale_date STRING, region STRING);
    
    -- 修改表格的cluster屬性。
    ALTER TABLE sale_detail clustered BY (customer_id) sorted BY (customer_id) INTO 10 buckets;

    更多關於cluster屬性的介紹請參見Hash ClusteringRange Clustering

重新命名表

重新命名表的名稱。僅修改表的名字,不改動表中的資料。

  • 命令格式

    ALTER TABLE <table_name> RENAME TO <new_table_name>;
  • 參數說明

    • table_name:必填。待修改名稱的表。

    • new_table_name:必填。修改後的表名稱。如果已存在與new_table_name同名的表,會返回報錯。

  • 使用樣本

    ALTER TABLE sale_detail RENAME TO sale_detail_rename;

修改表的生命週期

修改已存在的分區表或非分區表的生命週期。

  • 命令格式

    ALTER TABLE <table_name> SET LIFECYCLE <days>;
  • 參數說明

    • table_name:必填。需要修改生命週期的表名。

    • days:必填。修改後的生命週期時間,只能為正整數,單位為天。

  • 使用樣本

    -- 修改test_lifecycle表,將生命週期設為50天。
    ALTER TABLE test_lifecycle SET LIFECYCLE 50;

禁止或恢複生命週期

禁止或恢複指定表或分區的生命週期。

  • 命令格式

    ALTER TABLE <table_name> PARTITION [<pt_spec>] {enable|disable} LIFECYCLE;
  • 參數說明

    • table_name:必填。待禁止或恢複生命週期的表的名稱。

    • pt_spec:可選。待禁止或恢複生命週期的表的分區資訊。格式為partition_col1=col1_value1, partition_col2=col2_value1...。對於有多級分區的表,必須指明全部的分區值。

    • enable:恢複表或指定分區的生命週期功能。

      • 表及其分區重新參與生命週期回收,預設使用當前表及分區上的生命週期配置。

      • 開啟表生命週期前可以修改表及分區的生命週期配置,防止開啟表生命週期後因使用之前的配置導致資料被誤回收。

    • disable:禁止表或指定分區的生命週期功能。

      • 禁止表本身及其所有分區被生命週期回收,優先順序高於恢複表分區生命週期。即當使用table disable LIFECYCLE時,pt_spec enable LIFECYCLE設定無效。

      • 禁止表的生命週期功能後,表的生命週期配置及其分區的enabledisable標記會被保留。

      • 禁止表的生命週期功能後,仍然可以修改表及分區的生命週期配置。

  • 使用樣本

    • 樣本1:禁止表trans的生命週期功能。

      ALTER TABLE trans disable LIFECYCLE;
    • 樣本2:禁止表trans中時間為20141111分區的生命週期功能。

      ALTER TABLE trans PARTITION (dt='20141111') disable LIFECYCLE;

添加分區

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

  • 限制條件

    • MaxCompute單表支援的分區數量上限為6萬個。

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

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

  • 命令格式

    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是分區值。分區欄位不區分大小寫,分區值區分大小寫。

  • 使用樣本

    • 樣本1:給表sale_detail添加一個分區,用來儲存2013年12月杭州地區的銷售記錄。

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

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

      ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='20111011');

刪除分區

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

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中刪除一個分區,2013年12月杭州分區的銷售記錄。
      ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='201312',region='hangzhou');
       
      -- 從表sale_detail中同時刪除兩個分區,2013年12月杭州和上海分區的銷售記錄。
      ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='201312',region='hangzhou'), PARTITION(sale_date='201312',region='shanghai');
    • 指定篩選條件

      -- 建立分區表。
      CREATE TABLE IF NOT EXISTS sale_detail(
      shop_name     STRING,
      customer_id   STRING,
      total_price   DOUBLE)
      partitioned BY (sale_date STRING);
      
      -- 添加分區。
      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');
      
      -- 大量刪除分區。
      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');
      
      -- 支援多個分區過濾運算式,運算式之間是OR的關係。
      ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'), PARTITION(sale_date >= '202007');
      
      -- 添加其他格式分區。
      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');
      
      -- 大量刪除分區,使用Regex匹配分區。
      ALTER TABLE sale_detail 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 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='201312', region='shanghai'的LastModifiedTime。
    ALTER TABLE sale_detail touch PARTITION (sale_date='201312', 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 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'的分區到hh='00',mm='00'中。
      ALTER TABLE intpstringstringstring MERGE PARTITION(hh='00') overwrite PARTITION(ds='20181101', hh='00', mm='00');
      
      -- 查看合并後的分區。
      SHOW partitions intpstringstringstring;
      
      ds=20181101/hh=00/mm=00
      ds=20181101/hh=10/mm=00
      ds=20181101/hh=10/mm=10                    
    • 樣本2:合并指定的多個分區到目標資料分割。

      -- 合并多個指定分區。
      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;
      
      -- 查看分區表的分區。
      SHOW partitions intpstringstringstring;
      
      ds=20181101/hh=00/mm=00

添加列或注釋

為已存在的非分區表或分區表添加列或注釋,請注意表結構變更使用限制。MaxCompute已支援添加STRUCT類型的列,例如STRUCT<x: STRING, y: BIGINT>MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>>

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    ALTER TABLE <table_name> 
          ADD COLUMNS [IF NOT EXISTS]
              (<col_name1> <type1> COMMENT ['<col_comment>']
               [, <col_name2> <type2> COMMENT '<col_comment>'...]
              );
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待新增列的表名稱。添加的新列不支援指定順序,預設在最後一列。

    col_name

    新增列的名稱。

    type

    新增列的資料類型。

    col_comment

    新增列的注釋。

  • 使用樣本

    • 樣本1:給表sale_detail添加兩個列。

      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT);
    • 樣本2:給表sale_detail添加兩個列並同時添加列注釋。

      ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT '客戶', education BIGINT COMMENT '教育' );
    • 樣本3:給表sale_detail添加一個複雜資料類型列。

      ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>);
    • 樣本4:增加Delta Table的列。

      ALTER TABLE mf_tt ADD COLUMNS (val2 bigint);
    • 樣本5:給表sale_detail增加ID列SQL會返回成功,但實際並不會重複增加。

      -- 返回成功,但實際並不會重複增加ID列。
      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint);

刪除列

為已存在的非分區表或分區表刪除指定的單個或多個列,請注意表結構變更使用限制

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    -- 刪除單個列。
    ALTER TABLE <table_name> DROP COLUMN <col_name>;
    
    -- 刪除多列。
    ALTER TABLE <table_name> DROP COLUMNS <col_name1>[, <col_name2>...];
  • 參數說明

    • table_name:必填。待刪除列的表名稱。

    • col_name:必填。待刪除的列名稱。

  • 使用樣本

    -- 刪除表sale_detail單個列customer_id。輸入yes確認後,即可刪除列。 
    ALTER TABLE sale_detail DROP COLUMN customer_id;
    
    -- 刪除表sale_detail的列customer_id。輸入yes確認後,即可刪除列。
    ALTER TABLE sale_detail DROP COLUMNS customer_id;
    
    -- 刪除表sale_detail的列shop_name和customer_id。輸入yes確認後,即可刪除列。
    ALTER TABLE sale_detail DROP COLUMNS shop_name, customer_id;

更改列資料類型

為已存在的列更改資料類型,請注意表結構變更使用限制

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    ALTER TABLE <table_name> CHANGE [COLUMN] <old_column_name> <new_column_name> <new_data_type>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列資料類型的表名稱。

    old_column_name

    待修改列資料類型的列名稱。

    new_column_name

    修改列資料類型後的列名稱。

    說明

    old_column_name可以與new_column_name保持一致,表示不修改列名稱。但是new_column_name不能與除old_column_name之外的列名稱相同。

    new_data_type

    待修改的列修改後的資料類型。

  • 使用樣本

    -- 將mf_evol_t3表的id欄位由INT轉化為BIGINT。
    ALTER TABLE mf_evol_t3 CHANGE id id BIGINT;
    
    -- 將mf_evol_t3表的id欄位類型由BIGINT轉化為STRING。
    ALTER TABLE mf_evol_t3 CHANGE COLUMN id id STRING;
  • 資料類型支援轉換表

    說明

    Y表示支援轉換;N表示不支援轉換;-表示不涉及;Y()表示滿足括弧內的條件支援轉換。

    資料類型支援轉換表

修改列的順序

為已存在的非分區表或分區表修改列順序,請注意表結構變更使用限制

  • 參數設定

    設定參數setproject odps.schema.evolution.enable=true;開通功能。

    • 許可權要求:該參數為專案空間的Project級屬性,需操作帳號為專案的Owner或者帳號被賦予了專案層級的Super_Administrator或Admin角色,操作詳情請參見為使用者賦予內建管理角色

    • 生效時間:修改該參數需要等待10分鐘後才會生效。

  • 命令格式

    ALTER TABLE <table_name> CHANGE <old_column_name> <new_column_name> <column_type> AFTER <column_name>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列順序的表名稱。

    old_column_name

    待修改順序的列的原始名稱。

    new_col_name

    修改後的列名稱。

    說明

    new_col_name可以與old_column_name保持一致,表示不修改列名稱。但new_col_name不能與除old_column_name的之外的列名稱相同。

    column_type

    待修改的列的未經處理資料類型。不可修改。

    column_name

    將待調整順序的列調整至column_name之後。

  • 使用樣本

    -- 修改表sale_detail的列customer_id為customer並位於total_price之後。
    ALTER TABLE sale_detail CHANGE customer_id customer STRING AFTER total_price;
    
    -- 修改表sale_detail的列customer_id位於total_price之後,不修改列名稱。
    ALTER TABLE sale_detail CHANGE customer_id customer_id STRING AFTER total_price;

修改列名

為已存在的非分區表或分區表修改列名稱。

  • 命令格式

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> RENAME TO <new_col_name>;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列名的表名稱。

    old_col_name

    待修改的列名稱。

    說明

    必須是已存在的列。

    new_col_name

    修改後的列名稱,列名稱不能重複。

  • 使用樣本

    -- 修改表sale_detail的列名customer_name為customer。
    ALTER TABLE sale_detail CHANGE COLUMN customer_name RENAME TO customer;

修改列注釋

為已存在的非分區表或分區表修改列注釋。

  • 文法格式

    ALTER TABLE <table_name> CHANGE COLUMN <col_name> COMMENT '<col_comment>';
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列注釋的表名稱。

    col_name

    待修改注釋的列名稱。

    說明

    必須是已存在的列。

    col_comment

    修改後的注釋資訊。注釋內容為長度不超過1024位元組的有效字串,否則報錯。

  • 使用樣本

    -- 修改表sale_detail的列customer的注釋。
    ALTER TABLE sale_detail CHANGE COLUMN customer COMMENT 'customer';

修改列名及注釋

修改非分區表或分區表的列名或注釋。

  • 命令格式

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> <new_col_name> <column_type> COMMENT '<col_comment>';
  • 參數說明

    參數

    是否必填

    說明

    table_name

    需要修改列名以及注釋的表名稱。

    old_col_name

    需要修改的列名稱。

    說明

    必須是已存在的列。

    new_col_name

    新的列名稱,列名稱不能重複。

    column_type

    列的資料類型。

    col_comment

    可選

    修改後的注釋資訊,內容最長為1024位元組。

  • 使用樣本

    -- 修改表sale_detail的列名customer_name為customer_newname,注釋“客戶”為“customer”。
    ALTER TABLE sale_detail CHANGE COLUMN customer_name customer_newname STRING COMMENT 'customer';

修改表的列非空屬性

修改表的非分區列的非空屬性。即如果表的非分區列值禁止為NULL,可以通過本命令修改分區列值允許為NULL

修改分區列值允許為NULL後,不可回退,不支援再修改分區列值禁止為NULL,請謹慎操作。

  • 通過DESC EXTENDED table_name;命令查看Nullable屬性值,判斷列的非空屬性:

    • 如果Nullabletrue,表示允許為NULL;

    • 如果Nullablefalse,表示禁止為NULL。

  • 命令格式

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL;
  • 參數說明

    參數

    是否必填

    說明

    table_name

    待修改列非空屬性的表名稱。

    old_col_name

    待修改的非分區列的名稱。

    說明

    必須是已存在的非分區列。

  • 使用樣本

    -- 建立一張分區表,id列禁止為NULL。
    CREATE TABLE null_test(id INT NOT NULL, name STRING) PARTITIONED BY (ds string);
    
    -- 修改id列允許為NULL。
    ALTER TABLE null_test CHANGE COLUMN id NULL;

合并Transactional表檔案

Transactional表底層實體儲存體為不支援直接讀取的Base檔案和Delta檔案。對Transactional表執行updatedelete操作時,只會追加Delta檔案,不會修改Base檔案。因此,更新或刪除次數越多,表的儲存佔用越大,查詢費用也會增加。

對同一表或分區,執行多次updatedelete操作,會產生較多Delta檔案。系統讀資料時,需要載入這些Delta檔案來確定哪些行被更新或刪除,較多的Delta檔案會影響資料讀取效率。此時您可以將Base檔案和Delta合并,減少儲存以便提升資料讀取效率。

  • 命令格式

    ALTER TABLE <table_name> [PARTITION (<partition_key> = '<partition_value>' [, ...])] compact {minor|major};
  • 參數說明

    • table_name:必填。待合并檔案的Transactional表名稱。

    • partition_key:可選。當Transactional表為分區表時,指定分區列名。

    • partition_value:可選。當Transactional表為分區表時,指定分區列名對應的列值。

    • major|minor:至少選擇其中一個。二者的區別是:

      • minor:只將Base檔案及其下所有的Delta檔案合并,消除Delta檔案。

      • major:不僅將Base檔案及其下所有的Delta檔案合并,消除Delta檔案,還會把表對應的Base檔案中的小檔案進行合并。當Base檔案較小(小於32 MB)或有Delta檔案的情況下,等價於重新對錶執行insert overwrite操作,但當Base檔案足夠大(大於等於32 MB ),且不存在Delta檔案的情況下,不會重寫。

  • 使用樣本

    • 樣本1:基於Transactional表acid_delete,合并表檔案。命令樣本如下:

      ALTER TABLE acid_delete compact minor;

      返回結果如下:

      Summary:
      Nothing found to merge, set odps.merge.cross.paths=true IF cross path merge is permitted.
      OK
    • 樣本2:基於Transactional表acid_update_pt,合并表檔案。命令樣本如下:

      ALTER TABLE acid_update_pt PARTITION (ds = '2019') compact major;

      返回結果如下:

      Summary:
      table name: acid_update_pt /ds=2019  instance count: 2  run time: 6
        before merge, file count:        8  file size: 2613  file physical size: 7839
         after merge, file count:        2  file size: 679  file physical size: 2037
      
      OK

合并小檔案

Distributed File System按塊Block存放,檔案大小比塊大小(64 M)小的檔案稱之為小檔案。分布式系統不可避免會產生小檔案,比如SQL或其他分布式引擎計算結果,tunnel資料擷取都會產生小檔案,小檔案合并可以提高計算效能。

命令格式

ALTER TABLE <tablename> [PARTITION(<partition_key>=<partition_value>)] MERGE SMALLFILES;
  • 參數說明

    • table_name:必填。待合并檔案的表名稱。

    • partition_key:可選。當表為分區表時,指定分區列名。

    • partition_value:可選。當表為分區表時,指定分區列名對應的列值。

  • 使用樣本

    SET odps.merge.cross.paths=true;
    SET odps.merge.smallfile.filesize.threshold=128;
    SET odps.merge.max.filenumber.per.instance = 2000;
    ALTER TABLE tbcdm.dwd_tb_log_pv_di PARTITION (ds='20151116') MERGE smallfiles;

使用合并小檔案功能需要用到計算資源,如果您購買的執行個體是隨用隨付,會產生相關費用,具體計費規則與SQL隨用隨付保持一致,詳情請參見計算費用(隨用隨付)

更多詳情,請參見合并小檔案

相關命令

  • CREATE TABLE:建立非分區表、分區表、外部表格或聚簇表。

  • TRUNCATE:將指定表中的資料清空。

  • DROP TABLE:刪除分區表或非分區表。

  • DESC TABLE/VIEW:查看MaxCompute內部表、視圖、物化視圖、外部表格、聚簇表或Transactional表的資訊。

  • SHOW:查看錶的SQL DDL語句、列出專案下所有的表和視圖或列出一張表中的所有分區。\