すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:ALTER TABLE

最終更新日:Jan 14, 2026

テーブルを変更します。

適用範囲

スキーマ進化には、既存のテーブルにおける複雑なデータ型の列の追加、列の削除、列の順序の変更、列のデータ型の変更などの操作が含まれます。 列の順序を変更したり、新しい列を追加して列の順序を変更したり、列を削除したりすると、テーブルの読み書きの動作が変更されます。 次の制限が適用されます。

  • ジョブタイプが 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 を使用するとエラーが報告されます。

テーブルオーナーの変更

テーブルのオーナーを変更します。

  • 構文

    ALTER TABLE <table_name> changeowner TO <new_owner>;
  • パラメーター

    • table_name:必須。 オーナーを変更するテーブルの名前。

    • new_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 文を使用して、クラスタープロパティを追加または削除できます。

  • 構文

    • 次の構文は、テーブルにハッシュクラスタープロパティを追加するために使用されます。

      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];
    • 次の構文は、テーブルのハッシュクラスタープロパティを削除するために使用されます。

      ALTER TABLE <table_name> NOT clustered;
    • レンジクラスタープロパティを追加する場合、バケット数は不要であり、省略できます。 この場合、システムはデータ量に基づいて最適なバケット数を自動的に決定します。 構文は次のとおりです。

      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];
    • 次の構文は、テーブルまたはパーティションのレンジクラスタープロパティを削除するために使用されます。

      ALTER TABLE <table_name> NOT clustered;
      ALTER TABLE <table_name> PARTITION [<pt_spec>] NOT clustered;
      説明
      • ALTER TABLE を使用したクラスタープロパティの変更は、パーティションテーブルに対してのみ有効です。 非パーティションテーブルの場合、クラスタープロパティは作成後に変更できませんALTER TABLE 文は既存のテーブルに適用されます。 新しいクラスタープロパティを追加すると、新しいパーティションはこれらのプロパティに基づいて保存されます。

      • ALTER TABLE 文は、パーティションテーブルの新しいパーティションにのみ影響します。これには INSERT OVERWRITE によって生成されたものも含まれます。 新しいパーティションは新しいクラスタープロパティに基づいて保存されますが、古いデータパーティションのクラスタープロパティとストレージは変更されません。 これは、以前にクラスタープロパティが設定されていたテーブルに対して、それらを無効にし、新しいクラスター設定を追加し、新しいパーティションに異なるクラスターキー列、ソートキー列、およびバケット数を指定できることを意味します。

      • 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);
    
    -- テーブルのクラスタープロパティを変更します。
    ALTER TABLE sale_detail clustered BY (customer_id) sorted BY (customer_id) INTO 10 buckets;

    クラスタープロパティの詳細については、「ハッシュクラスタリング」および「レンジクラスタリング」をご参照ください。

PK Delta テーブルのプロパティの変更

  • 構文

    -- パーティション化された PK Delta テーブルのバケット数を更新します。
    ALTER TABLE <table_name> SET tblproperties("write.bucket.num"="64");
    
    -- 非パーティション化された PK Delta テーブルのバケット数を更新します。 更新後、既存のデータは新しいバケット数に基づいて再配布されます。
    ALTER TABLE <table_name> REWRITE tblproperties("write.bucket.num"="128");
    
    -- TimeTravel を使用してクエリできる履歴データ状態の時間範囲 (時間単位) を指定する retain プロパティを更新します。
    ALTER TABLE <table_name> SET tblproperties("acid.data.retain.hours"="60");

テーブル名の変更

テーブルの名前を変更します。 この操作はテーブル名のみを変更し、テーブル内のデータは変更しません。

  • 構文

    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:必須。 新しいライフサイクル期間。 これは正の整数でなければなりません。 単位は日です。

  • -- sale_detail_rename テーブルのライフサイクルを 50 日に変更します。
    ALTER TABLE sale_detail_rename 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 設定は無効になります。

      • テーブルのライフサイクル機能を無効にした後も、テーブルのライフサイクル構成と、そのパーティションの enable および disable フラグは保持されます。

      • テーブルのライフサイクル機能を無効にした後も、テーブルとそのパーティションのライフサイクル構成を変更できます。

    • 例 1:`sale_detail_rename` テーブルのライフサイクル機能を無効にします。

      ALTER TABLE sale_detail_rename disable LIFECYCLE;
    • 例 2:`sale_detail_rename` テーブルの時刻が '201912' のパーティションのライフサイクル機能を無効にします。

      -- テストデータを挿入します。
      ALTER TABLE sale_detail_rename 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');
      
      ALTER TABLE sale_detail_rename PARTITION (sale_date= '201912',region='shanghai') disable LIFECYCLE;

パーティションの追加

既存のパーティションテーブルにパーティションを追加します。

  • 制限事項

    • 複数レベルのパーティションを持つテーブルにパーティションキー列の値を追加するには、すべてのパーティションを指定する必要があります。

    • この操作では、パーティションキー列の値のみを追加できます。 パーティションキー列の名前は追加できません。

  • 構文

    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 文の詳細については、「sale_detail という名前のテーブルの作成」をご参照ください。

    • 例 1:sale_detail テーブルにパーティションを追加します。 このパーティションには、2013 年 12 月の中国 (杭州) リージョンの販売レコードが保存されます。

      ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='201312', region='hangzhou');
    • 例 2:sale_detail テーブルに 2 つのパーティションを追加します。 これらのパーティションには、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');
    • 例 4:Delta テーブルにパーティションを追加します。

      -- Delta テーブルを作成します。
      CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, 
                          val BIGINT NOT NULL) 
                   PARTITIONED BY (dd STRING, hh STRING) 
                  TBLPROPERTIES ("transactional"="true"); 
                   
      -- テーブルにパーティションを追加します。
      ALTER TABLE mf_tt ADD PARTITION (dd='01', hh='01');
    • 例 5:Delta テーブルのプロパティを変更します。

      -- Delta テーブルの write.bucket.num プロパティを変更します。 パーティション化された Delta テーブルのプロパティのみを変更できます。 非パーティション化された Delta テーブルのプロパティは変更できません。
      ALTER TABLE mf_tt3 SET tblproperties("write.bucket.num"="64");
      
      -- Delta テーブルの acid.data.retain.hours プロパティを変更します。
      ALTER TABLE mf_tt3 SET tblproperties("acid.data.retain.hours"="60");

パーティションの LastModifiedTime の値の変更

MaxCompute SQL が提供する TOUCH 文を実行して、パーティションテーブルのパーティションの LastDataModifiedTime の値を変更します。 この文は、LastModifiedTime の値を現在の時刻に変更します。 この場合、MaxCompute はデータが更新されたとみなし、パーティションの新しいライフサイクルが LastModifiedTime で指定された時刻から開始されます。

  • 制限事項

    テーブルに複数レベルのパーティションが含まれている場合、パーティションの LastModifiedTime の値を変更する際には、すべてのパーティションレベルを指定する必要があります。

  • 構文

    ALTER TABLE <table_name> touch PARTITION (<pt_spec>);
  • パラメーター

    パラメーター

    必須

    説明

    table_name

    はい

    LastModifiedTime の値を変更するパーティションテーブルの名前。 テーブルが存在しない場合、エラーが返されます。

    pt_spec

    はい

    LastModifiedTime の値を変更するパーティション。 フォーマット:(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 文を実行してパーティションキー列の値を変更できます。

  • 制限事項

    • RENAME 文はパーティションキー列の値を変更できますが、列名は変更できません。

    • テーブルに複数レベルのパーティションが含まれている場合、パーティションの LastModifiedTime の値を変更する際には、すべてのパーティションレベルを指定する必要があります。

  • 構文

    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');

パーティションのマージ

パーティションテーブルの複数のパーティションを 1 つのパーティションにマージします。 MaxCompute SQL では、MERGE PARTITION 文を実行して、テーブルの複数のパーティションを 1 つのパーティションにマージできます。 この操作は、マージされたパーティションに関するディメンション情報を削除し、パーティションデータを指定されたパーティションに移行します。

  • 制限事項

    • 外部テーブルのパーティションはマージできません。 クラスター化テーブルのパーティションが 1 つのパーティションにマージされた後、そのパーティションにはクラスタリング属性がありません。

    • 一度に最大 4,000 個のパーティションをマージできます。

  • 構文

    ALTER TABLE <table_name> MERGE [IF EXISTS] PARTITION (<predicate>) [, PARTITION(<predicate2>) ...] overwrite PARTITION (<fullpartitionSpec>) [purge];
  • パラメーター

    パラメーター

    必須

    説明

    table_name

    はい

    パーティションをマージするパーティションテーブルの名前。

    IF EXISTS

    いいえ

    IF EXISTS を指定せず、指定されたパーティションが存在しない場合、この操作は失敗し、エラーが返されます。 IF EXISTS が指定されているが、merge 条件を満たすパーティションがない場合、マージ後に新しいパーティションは生成されません。 マージプロセス中にソースデータが insertrename、または drop などの操作によって変更された場合、IF EXISTS が指定されていてもエラーが返されます。

    predicate

    はい

    マージするパーティションを照合するために使用される条件。

    fullpartitionSpec

    はい

    マージ後に生成されるパーティション。

    purge

    いいえ

    オプションのキーワード。 このパラメーターを構成すると、セッションディレクトリがクリアされます。 デフォルトでは、過去 3 日間に生成されたログが削除されます。 詳細については、「パージ」をご参照ください。

    • 例 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' 条件を満たすすべてのパーティションを ds='20181101', 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:指定されたパーティションを 1 つのパーティションにマージします。

      -- 指定されたパーティションを 1 つのパーティションにマージします。
      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 では、指定されたフィルター条件に基づいてパーティションを削除できます。 指定されたフィルター条件を満たす複数のパーティションを一度に削除したい場合は、式を使用してフィルター条件を指定し、そのフィルター条件でパーティションを照合して、一度にパーティションを削除できます。

  • 制限事項

    • PARTITION (<partition_filtercondition>) 句では、1 つのパーティションキー列の情報のみを指定できます。

    • 式を使用して PARTITION (<partition_filtercondition>) を指定する場合、その式には組み込みのスカラー関数のみを使用できます。

  • 注意事項

    • パーティションを削除すると、MaxCompute プロジェクト内の保存データ量が減少します。

    • パーティションテーブルにライフサイクルを指定できます。 これにより、MaxCompute は、ライフサイクルで指定された時間内にデータが更新されないパーティションを自動的に回収します。 ライフサイクルの詳細については、「ライフサイクル」をご参照ください。

  • 構文

    • フィルター条件が指定されていません。

      -- 一度に 1 つのパーティションを削除します。
      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:比較値または正規表現。 この値のデータ型は、パーティションキー列のデータ型と同じでなければなりません。

    • scalar():スカラー関数。 スカラー関数は入力値に基づいてスカラーを生成し、partition_col で指定された列の値を処理し、relational_operators で指定された関係演算子を使用して、処理された値を partition_col_value で指定された値と比較します。

    • フィルター条件は、論理演算子 NOT、AND、および OR をサポートします。 PARTITION (NOT <partition_filtercondition>) を使用して、指定したフィルター条件の補集合を取得できます。 PARTITION (<partition_filtercondition1> AND|OR <partition_filtercondition2>) を使用して、パーティションを照合するために使用される条件を取得できます。

    • 複数の PARTITION (<partition_filtercondition>) 句がサポートされています。 これらの句がカンマ (,) で区切られている場合、句間の論理関係は OR です。 フィルター条件は OR 論理関係に基づいて取得され、パーティションを照合するために使用されます。

    • フィルター条件が指定されていません。

      -- sale_detail テーブルからパーティションを削除します。 このパーティションには、2013 年 12 月の中国 (杭州) リージョンの販売レコードが保存されます。
      ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='201312',region='hangzhou'); 
      -- sale_detail テーブルから 2 つのパーティションを削除します。 これらのパーティションには、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');
      -- 複数の PARTITION (<partition_filtercondition>) 句を使用してパーティションを削除します。 これらの句間の論理関係は 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');
      -- 正規表現を使用して削除するパーティションを照合し、これらのパーティションを一度に削除します。
      ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date RLIKE '2019-\\d+-\\d+');
      -- region_sale_detail という名前のテーブルを作成します。 このテーブルには複数レベルのパーティションが含まれています。
      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');
      -- 次の文を実行して、複数レベルのパーティションを一度に削除します。 2 つの PARTITION (<partition_filtercondition>) 句の間の論理関係は OR です。 文が実行された後、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');

      複数レベルのパーティションを一度に削除する場合、1 つの PARTITION (<partition_filtercondition>) 句で複数のパーティションキー列に基づくフィルター条件を指定することはできません。 そうしないと、次のエラーが返されます:FAILED: ODPS-0130071:[1,82] Semantic analysis exception - invalid column reference region, partition expression must have one and only one column reference

      -- PARTITION (<partition_filtercondition>) 句で複数のパーティションキー列の情報を指定すると、エラーが返されます。 不正な使用例:
      ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911' AND region = 'beijing');

列またはコメントの追加

既存の非パーティションテーブルまたはパーティションテーブルに列またはコメントを追加できます。 スキーマ進化の適用範囲にご注意ください。 MaxCompute は、STRUCT<x: STRING, y: BIGINT>MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>> などの STRUCT 型の列の追加をサポートしています。

  • パラメーター設定

    この機能を有効にするには、setproject odps.schema.evolution.enable=true; パラメーターを設定します。

    • 権限:これはプロジェクトレベルのパラメーターです。 プロジェクトオーナーであるか、プロジェクトレベルの 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 テーブルに 2 つの列を追加します。

      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT);
    • 例 2:sale_detail テーブルにコメント付きの 2 つの列を追加します。

      ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT 'Customer', education BIGINT COMMENT 'Education' );
    • 例 3:sale_detail テーブルに複雑なデータ型の列を追加します。

      ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>);
    • 例 4:SQL 文を実行して、ID 列などの既存の列を sale_detail テーブルに追加すると、成功メッセージが返され、列は再度追加されません。

      -- 文は成功しますが、ID 列は繰り返し追加されません。
      ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint);
    • 例 5:Delta テーブルに列を追加します。

      CREATE TABLE delta_table_test (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) 
        TBLPROPERTIES ("transactional"="true");
        
      ALTER TABLE delta_table_test ADD COLUMNS (val2 bigint);

列の削除

既存の非パーティションテーブルまたはパーティションテーブルから 1 つ以上の指定された列を削除できます。 スキーマ進化の適用範囲にご注意ください。

  • パラメーター設定

    この機能を有効にするには、setproject odps.schema.evolution.enable=true; パラメーターを設定します。

    • 権限:これはプロジェクトレベルのパラメーターです。 プロジェクトオーナーであるか、プロジェクトレベルの Super_Administrator または Admin ロールを持っている必要があります。 詳細については、「ユーザーへの組み込み管理ロールの割り当て」をご参照ください。

    • 有効期間:パラメーターは設定後約 10 分で有効になります。

  • コマンド形式

    -- 1 つの列を削除します。
    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; パラメーターを設定します。

    • 権限:これはプロジェクトレベルのパラメーターです。 プロジェクトオーナーであるか、プロジェクトレベルの 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_namenew_column_name と同じにすることができます。これは、列名が変更されないことを意味します。 ただし、new_column_nameold_column_name 以外のどの列の名前とも同じにすることはできません。

    new_data_type

    はい

    列の新しいデータ型。

  • -- sale_detail テーブルの id フィールドのデータ型を BIGINT から STRING に変更します。
    ALTER TABLE sale_detail CHANGE COLUMN id id STRING;
  • データ型変換テーブル

    説明

    Y は変換がサポートされていることを示します。 N は変換がサポートされていないことを示します。 - は変換が適用されないことを示します。 Y() は、括弧内の条件が満たされた場合に変換がサポートされることを示します。

    Data type conversion table

列の順序の変更

既存の非パーティションテーブルまたはパーティションテーブルの列の順序を変更できます。 スキーマ進化の適用範囲にご注意ください。

  • パラメーター設定

    この機能を有効にするには、setproject odps.schema.evolution.enable=true; パラメーターを設定します。

    • 権限:これはプロジェクトレベルのパラメーターです。 プロジェクトオーナーであるか、プロジェクトレベルの 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_nameold_column_name と同じにすることができます。これは、列名が変更されないことを意味します。 ただし、new_col_nameold_column_name 以外のどの列の名前とも同じにすることはできません。

    column_type

    はい

    列の元のデータ型。 これは変更できません。

    column_name

    はい

    並べ替える列を column_name の後に移動します。

  • -- sale_detail テーブルの customer 列の名前を customer_id に変更し、total_price 列の後に移動します。
    ALTER TABLE sale_detail CHANGE customer customer_id 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_detail0113 テーブルの customer 列のコメントを変更します。
    ALTER TABLE sale_detail0113 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 列の名前を customer_newname に変更し、そのコメントを 'customer' に変更します。
    ALTER TABLE sale_detail CHANGE COLUMN customer customer_newname STRING COMMENT 'customer';

列の NOT NULL プロパティの変更

テーブル内の非パーティションキー列の NOT NULL プロパティを変更して、NULL 値を許可できます。

列に NULL 値を許可した後、この変更を元に戻して NULL 値を許可しないようにすることはできません。 慎重に進めてください。

  • DESC EXTENDED table_name; コマンドを実行して、Nullable プロパティの値を確認し、列が NULL 値を許可するかどうかを判断できます。

    • Nullabletrue の場合、NULL 値が許可されます。

    • Nullablefalse の場合、NULL 値は許可されません。

  • コマンド形式

    ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL;
  • パラメーター

    パラメーター

    必須

    説明

    table_name

    はい

    列の NOT NULL プロパティを変更するテーブルの名前。

    old_col_name

    はい

    変更する非パーティションキー列の名前。 列は既存の非パーティションキー列でなければなりません。

  • -- id 列が NULL にできないパーティションテーブルを作成します。
    CREATE TABLE null_test(id INT NOT NULL, name STRING) PARTITIONED BY (ds string);
    
    -- テーブルのプロパティを表示します。
    DESC EXTENDED null_test;
    -- 次の結果が返されます:
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | int    |       |               | false    | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | ds              | string     |                                                     |
    +------------------------------------------------------------------------------------+
    
    -- id 列を NULL にできるようにします。
    ALTER TABLE null_test CHANGE COLUMN id NULL;
    -- テーブルのプロパティを表示します。
    DESC EXTENDED null_test;
    -- 次の結果が返されます:
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | id       | int    |       |               | true     | NULL         |              |
    | name     | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | ds              | string     |                                                     |
    +------------------------------------------------------------------------------------+

トランザクションテーブルのファイルのコンパクト化

トランザクションテーブルの基盤となる物理ストレージは、直接読み取ることができないベースファイルとデルタファイルで構成されています。 トランザクションテーブルに対して update または delete 操作を実行すると、デルタファイルのみが追加されます。 ベースファイルは変更されません。 したがって、頻繁な更新または削除操作は、テーブルのストレージフットプリントとクエリコストを増加させます。

同じテーブルまたはパーティションに対して複数の update または delete 操作を実行すると、多くのデルタファイルが生成されます。 システムがデータを読み取る際、これらのデルタファイルをロードして、どの行が更新または削除されたかを判断する必要があります。 多くのデルタファイルは、データ読み取りパフォーマンスを低下させる可能性があります。 この場合、ベースファイルとデルタファイルをコンパクションして、ストレージを削減し、データ読み取り効率を向上させることができます。

  • 構文

    ALTER TABLE <table_name> [PARTITION (<partition_key> = '<partition_value>' [, ...])] compact {minor|major};
  • パラメーター

    • table_name:必須。 ファイルをコンパクションするトランザクションテーブルの名前。

    • partition_key:オプション。 トランザクションテーブルがパーティションテーブルの場合、パーティションキー列名を指定します。

    • partition_value:オプション。 トランザクションテーブルがパーティションテーブルの場合、パーティションキー列の値を指定します。

    • major|minor:少なくとも 1 つを選択する必要があります。 違いは次のとおりです。

      • minor:ベースファイルとそのすべてのデルタファイルのみをコンパクションして、デルタファイルを削除します。

      • major:ベースファイルとそのすべてのデルタファイルをコンパクションしてデルタファイルを削除するだけでなく、テーブルの対応するベースファイル内のスモールファイルもマージします。 ベースファイルが小さい (32 MB 未満) 場合、またはデルタファイルが存在する場合、これはテーブルに対して insert overwrite 操作を再度実行するのと同じです。 ただし、ベースファイルが十分に大きい (32 MB 以上) 場合で、デルタファイルが存在しない場合、ファイルは書き換えられません。

    • 例 1:トランザクションテーブル `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:トランザクションテーブル `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

スモールファイルのマージ

分散ファイルシステムは、データをブロック単位で保存します。 ブロックサイズ (64 MB) より小さいファイルはスモールファイルと呼ばれます。 分散システムでは、必然的にスモールファイルが生成されます。 たとえば、スモールファイルは、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 内部テーブル、ビュー、マテリアライズドビュー、外部テーブル、クラスター化テーブル、またはトランザクションテーブルに関する情報を表示します。

  • SHOW:テーブルの SQL DDL 文を表示したり、プロジェクト内のすべてのテーブルとビューをリストしたり、テーブル内のすべてのパーティションをリストしたりします。