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

MaxCompute:パーティションと列の操作

最終更新日:Dec 06, 2024

MaxComputeでは、既存のテーブルのパーティションと列で操作を実行できます。 たとえば、ビジネス要件に基づいて、パーティションの追加、列の追加、列の削除、列のデータ型の変更を行うことができます。

次の表に、MaxComputeテーブルのパーティションまたは列の操作に使用できるステートメントを示します。

タイプ

操作

説明

承認済みユーザー

操作プラットフォーム

パーティション操作

パーティションの追加

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

テーブルに対するAlter権限を持つユーザー

このトピックで説明されているステートメントは、次のプラットフォームで実行できます。

パーティションの削除

既存のパーティションテーブルからパーティションを削除します。

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

パーティションテーブルのパーティションのLastModifiedTimeの値を変更します。

パーティションキー列の値の変更

パーティションテーブルのパーティションキー列の値を変更します。

マージパーティション

パーティションテーブルの複数のパーティションを1つのパーティションにマージします。 この操作は、マージされたパーティションに関するディメンション情報を削除し、指定されたパーティションにパーティションデータを転送します。

パーティションからのデータの消去

指定されたパーティションからデータをクリアします。

列操作

列または列コメントの追加

列または列コメントを既存の非パーティションテーブルまたはパーティションテーブルに追加します。

ドロップ列

既存の非パーティションテーブルまたはパーティションテーブルから列を削除します。

列のデータ型の変更

既存の列のデータ型を変更します。

列のシーケンスの変更

テーブル内の指定された列のシーケンスを変更します。

列の名前の変更

既存の非パーティションテーブルまたはパーティションテーブルの列の名前を変更します。

列のコメントの変更

既存の非パーティションテーブルまたはパーティションテーブルの列のコメントを変更します。

列の名前とコメントの変更

既存の非パーティションテーブルまたはパーティションテーブルの列の名前とコメントを同時に変更します。

テーブルのパーティションキー以外の列のnull非対応プロパティの変更

テーブル内のパーティション以外のキー列のnull非対応プロパティを変更します。

制限事項

  • MaxComputeテーブルのパーティションキー列として構成できるのは、TINYINT、SMALLINT、INT、BIGINT、CHAR、VARCHAR、およびSTRINGデータ型の列のみです。

  • MaxComputeテーブルには、最大6レベルのパーティションを含めることができます。

  • MaxComputeテーブルには、最大60,000個のパーティションを含めることができます。

  • MaxComputeでは、一度に最大10,000個のパーティションのデータをクエリできます。

  • スキーマ進化を使用する場合は、次の制限に注意してください。

    スキーマ進化機能を使用する場合は、複雑なデータ型の列を追加したり、列を削除したり、列の順序を変更したり、既存のテーブルの列のデータ型を変更したりできます。 テーブル内の列の順序を変更したり、テーブルに列を追加してから新しい列の順序を変更したり、列を削除したりすると、テーブルに対する読み取り操作と書き込み操作が影響を受けます。 実際の影響はシナリオによって異なります。

    • ジョブがMapReduceジョブであり、MapReduceのバージョンがV1.0の場合、Graphジョブを使用してテーブルからデータを読み書きすることはできません。

    • ジョブがCupidコンソールで実行されるSparkジョブで、次のいずれかのSparkバージョンが使用されている場合、ジョブを使用してテーブルからデータを読み取ることができます。 ジョブを使用してテーブルにデータを書き込むことはできません。

      • Spark-2.3.0-odps0.34.0

      • Spark-3.1.1-odps0.34.0

    • ジョブがPlatform for AI (PAI) ジョブの場合、列が削除されたテーブルからデータを読み取ることはできますが、テーブルに書き込むことはできません。

    • ジョブが、バージョンがV1.3より前のHologresインスタンスに属するHologresジョブである場合、Hologresが外部テーブルとしてテーブルを参照するときに、列が削除されたテーブルからデータを読み書きすることはできません。

    • スキーマの進化が実行されるテーブルに対して、CLONE TABLEステートメントを実行することはできません。

    • MaxCompute Steaming Tunnelを使用してテーブルにデータを書き込む場合、スキーマの進化は実行できません。 スキーマの進化を実行すると、エラーが報告されます。

  • パーティション分割トランザクションテーブルのパーティションをマージすることはできません。

  • パーティション分割されていないDeltaテーブルのデータをクリアしたり、Deltaテーブルのwrite.bucket.numプロパティを変更したりすることはできません。

パーティションの追加

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

  • 制限事項

    • MaxComputeテーブルは、最大60,000個のパーティションを持つことができます。

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

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

  • 構文

    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: 必須です。 追加するパーティション。The partition that you want to add. このパラメーターの値は、(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テーブルに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テーブルに1つ以上のパーティションを追加し、パーティションのパーティションキー列sale_dateのみを指定します。 パーティションの2つのパーティションキー列sale_dateとregionを指定する必要があるため、エラーが返されます。

      alter table sale_detail add if not exists partition (sale_date='20111011');
    • 例4: デルタテーブルにパーティションを追加します。

      -- Create a 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"); 
                   
      -- Add a partition to the table.           
      alter table mf_tt add partition (dd='01', hh='01');
    • 例5: Deltaテーブルのプロパティを変更します。

      -- Change the write.bucket.num property of a Delta table. You can change only the property of a partitioned Delta table. You cannot change the property of a non-partitioned Delta table.
      alter table mf_tt3 set tblproperties("write.bucket.num"="64");
      
      -- Change the acid.data.retain.hours property of a Delta table.
      alter table mf_tt3 set tblproperties("acid.data.retain.hours"="60");

パーティションの削除

既存のパーティションテーブルからパーティションを削除します。

MaxComputeでは、指定されたフィルター条件に基づいてパーティションを削除できます。 指定したフィルター条件を満たす複数のパーティションを一度に削除する場合は、式を使用してフィルター条件を指定し、フィルター条件を使用してパーティションを一致させ、パーティションを一度に削除できます。

  • 制限事項

    • partition (<partition_filtercondition>) 句で指定できるパーティションキー列は1つだけです。

    • 式を使用してPARTITION (<partition_filtercondition>) を指定する場合、式で使用される関数は組み込みのスカラー関数である必要があります。

  • 注意事項

    • MaxComputeプロジェクトのテーブルからパーティションを削除すると、MaxComputeプロジェクトに保存されているデータの量が減少します。

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

  • 構文

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

      -- Drop one partition at a time. 
      alter table <table_name> drop [if exists] partition <pt_spec>;
      -- Drop multiple partitions at a time. 
      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: 必須です。 削除するパーティション。The partition that you want to drop. このパラメーターの値は、(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で指定された列の値を処理し、relation_operatorsで指定されたリレーショナル演算子を使用して、処理された値をpartition_col_valueで指定された値と比較します。

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

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

  • 例:

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

      -- Drop a partition from the sale_detail table. The partition stores the sales record in the China (Hangzhou) region in December 2013. 
      alter table sale_detail drop if exists partition(sale_date='201312',region='hangzhou'); 
      -- Drop two partitions from the sale_detail table. The partitions store the sales records in the China (Hangzhou) and China (Shanghai) regions in December 2013. 
      alter table sale_detail drop if exists partition(sale_date='201312',region='hangzhou'),partition(sale_date='201312',region='shanghai');
    • フィルター条件が指定されています。

      -- Create a partitioned table named sale_detail. 
      create table if not exists sale_detail(
      shop_name     STRING,
      customer_id   STRING,
      total_price   DOUBLE)
      partitioned by (sale_date STRING);
      -- Add partitions to the table. 
      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');
      -- Drop partitions from the table at a time. 
      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');
      -- Drop partitions by using multiple PARTITION (<partition_filtercondition>) clauses. The logical relationship between these clauses is OR. 
      alter table sale_detail drop if exists partition(sale_date < '201911'), partition(sale_date >= '202007');
      -- Add partitions in other formats. 
      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');
      -- Use regular expressions to match the partitions that you want to drop and drop these partitions at a time. 
      alter table sale_detail drop if exists partition(sale_date RLIKE '2019-\\d+-\\d+');
      -- Create a table named region_sale_detail. The table contains multi-level partitions. 
      create table if not exists region_sale_detail(
      shop_name     STRING,
      customer_id   STRING,
      total_price   DOUBLE)
      partitioned by (sale_date STRING , region STRING );
      -- Add partitions to the region_sale_detail table. 
      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');
      -- Execute the following statement to drop multi-level partitions at a time. The logical relationship between the two PARTITION (<partition_filtercondition>) clauses is OR. After the statement is executed, the partitions in which the value of the sale_date column is earlier than 201911 and the partitions in which the value of the region column is beijing are dropped. 
      alter table region_sale_detail drop if exists partition(sale_date < '201911'),partition(region = 'beijing');
      -- Execute the following statement to drop a partition in which the value of the sale_date column is earlier than 201911 and the value of the region column is beijing. 
      alter table region_sale_detail drop if exists partition(sale_date < '201911', region = 'beijing');

      複数レベルのパーティションを一度に削除する場合、1つのpartition (<partition_filtercondition>) 句に複数のパーティションキー列の情報を指定することはできません。 それ以外の場合、次のエラーが返されます。FAILED: ODPS-0130071:[1,82] セマンティック解析例外-無効な列参照領域、パーティション式には1つだけの列参照が必要です

      -- If you specify the information of multiple partition key columns in one PARTITION (<partition_filtercondition>) clause, an error is returned. Example of incorrect usage: 
      alter table region_sale_detail drop if exists partition(sale_date < '201911' AND region = 'beijing');

パーティションの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は列の値を示します。 指定された列名または列値が存在しない場合、エラーが返されます。

  • 例:

    -- Change the value of LastModifiedTime for the partition in which the value of the sale_date column is 201312 and the value of the region column is shanghai in the sale_detail table. 
    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: 必須です。 新しいパーティション情報。The new partition information. このパラメーターの値は、(partition_col1 = new_partition_col_value1, partition_col2 = new_partition_col_value2, ...) 形式です。 partition_colは列名を示し、new_partition_col_valueは新しい列の値を示します。

  • 例:

    -- Change column values in a partition of the sale_detail table. 
    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条件を満たすパーティションがない場合、マージ後に新しいパーティションを生成することはできません。 文を使用してパーティションをマージし、ソースデータを同時に変更すると、If existsを指定してもエラーが返されます。 ステートメントは、INSERTRENAME、またはDROPです。

    • predicate: 必須です。 マージするパーティションを一致させるために使用される条件。

    • fullpartitionSpec: 必須です。 パーティションをマージした後に生成されるパーティション。

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

    • 例1: 指定された条件を満たすパーティションを宛先パーティションにマージします。

      -- View the partitions in a partitioned table. 
      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
      
      -- Merge all partitions that meet the hh='00' condition into the ds='20181101', hh='00', mm='00' partition. 
      alter table intpstringstringstring merge partition(hh='00') overwrite partition(ds='20181101', hh='00', mm='00');
      
      -- View the partition that is generated after you merge partitions. 
      show partitions intpstringstringstring;
      
      ds=20181101/hh=00/mm=00
      ds=20181101/hh=10/mm=00
      ds=20181101/hh=10/mm=10                    
    • 例2: 指定されたパーティションを宛先パーティションにマージします。

      -- Merge specified partitions into one partition. 
      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;
      -- View the partition that is generated in the partitioned table after you merge partitions. 
      show partitions intpstringstringstring;
      
      ds=20181101/hh=00/mm=00

パーティションからデータを消去する

パーティションテーブルの指定されたパーティションからデータをクリアします。

MaxComputeでは、指定されたフィルター条件を満たすパーティション内のデータを消去できます。 フィルタ条件を満たす1つ以上のパーティションを一度に削除する場合は、式を使用して条件を指定し、条件を使用してパーティションを一致させ、一致したパーティションからデータを消去できます。

  • 構文

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

      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: パーティション列の値。比較値または正規表現です。 この値のデータ型は、パーティション列のデータ型と同じである必要があります。

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

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

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

    • フィルター条件が指定されていないパーティションからデータを消去します。

      -- Clear the data from a partition of the sale_detail table. The partition stores the sales record in the China (Hangzhou) region in December 2013. 
      truncate table sale_detail partition(sale_date='201312',region='hangzhou');
      
      -- Clear the data from two partitions of the sale_detail table. The partitions store the sales records in the China (Hangzhou) and China (Shanghai) regions in December 2013. 
      truncate table sale_detail partition(sale_date='201312',region='hangzhou'),  partition(sale_date='201312',region='shanghai');
    • フィルター条件を指定したパーティションからデータを消去します。

      -- Clear the data from multiple partitions of the sale_detail table. The partitions store the sales records whose sales dates start with 2013 in the China (Hangzhou) region. 
      truncate table sale_detail partition(sale_date like '2013%' and region='hangzhou');
    • パーティション分割されていないDeltaテーブルからデータを消去します。

      -- Clear the data from a non-partitioned Delta table. The table must be a non-partitioned table. Otherwise, an error is reported.
      truncate table mf_tt2; 

列または列のコメントを追加する

列または列コメントを既存の非パーティションテーブルまたはパーティションテーブルに追加します。

説明
  • MaxComputeでは、STRUCT <x: string, y: bigint>map<string, struct<x: double, y: double>> などのstruct型の列を追加できます。 この機能を有効にする必要がある場合は、次の設定を追加し、制限に記載されている制限に注意してください。 設定は、追加してから10分後に有効になります。

    setproject odps.schema.evolution.enable=true;

    プロジェクトのプロジェクトレベルのプロパティを構成するには、プロジェクト所有者のアカウント、またはプロジェクトレベルの役割Super_AdministratorまたはAdminが割り当てられているアカウントを使用する必要があります。 ロールを割り当てる方法の詳細については、「組み込みの管理者ロールをユーザーに割り当てる」をご参照ください。

  • 構文

    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 struct<province:string, area:string>);
    • 例4: Deltaテーブルに列を追加します。

      ALTER TABLE mf_tt ADD columns (val2 bigint);
    • 例5: sale_detailテーブルにID列を追加します。 sale_detailテーブルにID列を追加すると、SQL文が実行されます。 ID列がすでにsale_detailテーブルに存在する場合、ID列はテーブルに繰り返し追加されません。

      -- The SQL statement is executed. If the ID column already exists in the sale_detail table, the ID column is not repeatedly added to the table.
      ALTER TABLE sale_detail ADD columns if not exists(id bigint);

ドロップ列

既存の非パーティションテーブルまたはパーティションテーブルから1つ以上の指定された列を削除します。

説明

この機能を有効にする必要がある場合は、次の設定を追加し、制限に記載されている制限に注意してください。 設定は、追加してから10分後に有効になります。

setproject odps.schema.evolution.enable=true;

プロジェクトのプロジェクトレベルのプロパティを構成するには、プロジェクト所有者のアカウント、またはプロジェクトレベルの役割Super_AdministratorまたはAdminが割り当てられているアカウントを使用する必要があります。 ロールを割り当てる方法の詳細については、「組み込みの管理者ロールをユーザーに割り当てる」をご参照ください。

  • 構文

    alter table <table_name> drop columns <col_name1>[, <col_name2>...];
  • パラメーター

    • table_name: 必須です。 列を削除するテーブルの名前。

    • col_name: 必須です。 ドロップする列の名前。

  • 例: テーブルから列を削除する

    -- Drop the customer_id column from the sale_detail table. Enter yes on the MaxCompute client to drop the column. 
    alter table sale_detail drop columns customer_id;
    
    -- Drop the shop_name and customer_id columns from the sale_detail table. Enter yes on the MaxCompute client to drop the columns. 
    alter table sale_detail drop columns shop_name, customer_id;

列のデータ型を変更する

既存の列のデータ型を変更します。

説明

この機能を有効にする必要がある場合は、次の設定を追加し、制限に記載されている制限に注意してください。 設定は、追加してから10分後に有効になります。

setproject odps.schema.evolution.enable=true;

プロジェクトのプロジェクトレベルのプロパティを構成するには、プロジェクト所有者のアカウント、またはプロジェクトレベルの役割Super_AdministratorまたはAdminが割り当てられているアカウントを使用する必要があります。 ロールを割り当てる方法の詳細については、「組み込みの管理者ロールをユーザーに割り当てる」をご参照ください。

  • 構文

    alter table <table_name> change [column] <old_column_name> <new_column_name> <new_data_type>;
  • パラメーター

    • table_name: 必須です。 列のデータ型を変更するテーブルの名前。

    • old_column_name: 必須です。 データ型を変更する列の名前。

    • new_column_name: 必須です。 列の新しい名前。 new_column_nameの値は、old_column_nameの値と同じにすることができます。 パラメーターの値が同じ場合、列の名前は変更されません。 new_column_nameパラメーターで指定された名前は、old_column_nameパラメーターで指定された名前を除いて、列の名前と同じにすることはできません。

    • new_data_type: 必須です。 データ型を変更する列の新しいデータ型。

  • -- Change the data type of the id column in the mf_evol_t3 table from INT to BIGINT.
    alter table mf_evol_t3 change id id bigint;
    -- Change the data type of the id column in the mf_evol_t3 table from BIGINT to STRING.
    alter table mf_evol_t3 change column id id string;
  • サポートされているデータ型変換

    説明

    データ型間の変換を次の表に示します。 Yは、データ型間の変換がサポートされていることを示します。 Nは、データ型間の変換がサポートされていないことを示します。 -は、データ型間の変換が含まれないことを示します。 Y() は、かっこ () で囲まれた条件を満たす場合にのみ、データ型間の変換がサポートされることを示します。

    数据类型支持转换表

列のシーケンスを変更する

既存の非パーティションテーブルまたはパーティションテーブルの列のシーケンスを変更します。

説明

この機能を有効にする必要がある場合は、次の設定を追加し、制限に記載されている制限に注意してください。 設定は、追加してから10分後に有効になります。

setproject odps.schema.evolution.enable=true;

プロジェクトのプロジェクトレベルのプロパティを構成するには、プロジェクト所有者のアカウント、またはプロジェクトレベルの役割Super_AdministratorまたはAdminが割り当てられているアカウントを使用する必要があります。 ロールを割り当てる方法の詳細については、「組み込みの管理者ロールをユーザーに割り当てる」をご参照ください。

  • 構文

    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: 必須です。 指定した列の後に配置する

  • -- Change the name of the customer_id column to customer and place the customer column after the total_price column in the sale_detail table. 
    alter table sale_detail change customer_id customer string after total_price;
    -- Place the customer_id column after the total_price column in the sale_detail table. The name of the customer_id column is not changed. 
    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: 必須です。 変更する列の名前。 old_col_nameで指定された列は、すでにテーブルに存在している必要があります。

    • new_col_name: 必須です。 シーケンスを変更する列の新しい名前。 指定するnew nameは、テーブルの既存の列名と同じにすることはできません。

  • -- Change the name of the customer_name column to customer in the sale_detail table. 
    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_nameで指定された列は、テーブルにすでに存在している必要があります。

    • col_comment: 必須です。 列の新しいコメント。The new comment of the column. 新しいコメントは、長さが1,024バイトを超えない有効な文字列である必要があります。 このパラメーターの値が要件を満たさない場合、エラーが返されます。

  • -- Modify the comment of the customer column in the sale_detail table. 
    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: 必須です。 名前とコメントを変更する必要がある列の元の名前。 old_col_nameで指定された列は、すでにテーブルに存在している必要があります。

    • new_col_name: 必須です。 列の新しい名前。 指定する新しい名前は、テーブルの既存の列名と同じにすることはできません。

    • column_type: 必須です。 列のデータ型。

    • col_comment: オプション。 列の新しいコメント。The new comment of the column. コメントの最大サイズは1,024バイトです。

  • -- Change the name of the customer_name column in the sale_detail table to customer_newname and the comment of the column to customer. 
    alter table sale_detail change column customer_name customer_newname STRING comment 'customer';

テーブル内のパーティション以外のキー列のnull非対応プロパティの変更

テーブル内のパーティション以外のキー列のnull非対応プロパティを変更します。 テーブル内の非パーティションキー列の値をnullにできない場合は、ステートメントを実行して列の値をnullにすることができます。

DESC EXTENDED table_name; ステートメントを実行して、Nullableプロパティの値を表示できます。 このプロパティは、非パーティションキー列の値をnullにできるかどうかを決定します。 Nullableプロパティの値がtrueの場合、列の値はnullになります。 Nullableプロパティの値がfalseの場合、列の値はnullであってはなりません。

  • 制限事項

    Nullableプロパティの値をtrueに変更すると、プロパティ設定を復元できません。 作業は慎重に行ってください。

  • 構文

    alter table <table_name> change column <old_col_name> null;
  • パラメーター

    • table_name: 必須です。 Nullableプロパティの値を変更するテーブルの名前。

    • old_col_name: 必須です。 Nullableプロパティを変更するパーティション以外のキー列の名前。 old_col_nameで指定された列は、すでにテーブルに存在している必要があります。

  • -- Create a partitioned table. The values in the id column must not be null. 
    create table null_test(id int not null, name string) partitioned by (ds string);
    -- Change the values in the id column to null. 
    alter table null_test change column id null;

関連ドキュメント

テーブル操作の詳細については、「テーブル操作」をご参照ください。