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

MaxCompute:列操作

最終更新日:Jan 20, 2025

MaxComputeは、列の追加や削除、列データ型の変更など、既存のテーブルに対する列の変更操作をサポートしています。 実際のビジネスシナリオに基づいて、対応する操作を実行できます。

MaxCompute SQLの列操作コマンドは次のとおりです。

操作

特徴

ロール

操作エントリ

列またはコメントの追加

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

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

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

ドロップ列

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

列データ型の変更

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

列の順序の変更

テーブル内の指定した列の順序を変更します。

列の名前の変更

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

列コメントの変更

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

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

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

非パーティション列のnull非許容プロパティの変更

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

制限事項

スキーマの進化には、既存のテーブルへの複雑なデータ型の列の追加、列の削除、列の順序とデータ型の変更が含まれます。 次のシナリオでは、列を追加または削除したり、列の順序を変更したりすると、テーブルの読み取りおよび書き込み動作が変更され、次の制限が適用されます。

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

  • ジョブでCUstomized PUshdown In Data (CUPID) コンピューティングフレームワークを使用している場合、次のバージョンのSparkのみを使用してテーブルからデータを読み取ることができますが、テーブルにデータを書き込むことはできません。

    • Spark-2.3.0-odps0.34.0

    • Spark-3.1.1-odps0.34.0

  • ジョブがAI (PAI) ジョブの場合、ジョブを使用してテーブルからデータを読み取ることはできますが、テーブルにデータを書き込むことはできません。

  • ジョブがHologresジョブで、Hologresのバージョンが1.3より前の場合、Hologresが外部テーブルとしてテーブルを参照するときに、データをテーブルから読み書きできません。

  • テーブルに対してスキーマ進化操作を実行した後、CLONE table機能はサポートされません。

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

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

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

説明
  • MaxComputeは、STRUCTタイプの列の追加をサポートしています。 たとえば、struct<x: string, y: bigint> またはmap<string, struct<x: double, y: double>> などです。 この機能を有効にする必要がある場合は、次のパラメーターを設定し、制限に注意してください。 パラメータが有効になるまでに約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 '客户', education BIGINT comment '教育' );
    • 例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列は繰り返しテーブルに追加されません。

      --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. After you input 'yes' for confirmation, the column will be deleted.
    ALTER TABLE sale_detail DROP columns customer_id;
    
    --Drop the shop_name and customer_id columns from the sale_detail table. After you input 'yes' for comfirmation, the column will be deleted.
    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

    対象

    データ型を変更する列の新しい名前。

    説明

    old_column_namenew_column_nameと同じにすることができます。これは、列名が変更されていないことを示します。 ただし、new_column_nameold_column_name以外の列名と一致することはできません。

    new_data_型

    対象

    データ型を変更する列の新しいデータ型。

  • 例。

    --Modify the id field of the mf_evol_t3 table from int to bigint. 
    ALTER TABLE mf_evol_t3 change id id bigint;
    --Modify the id field of 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_nameold_column_nameと同じにすることができます。 ただし、new_col_nameold_column_name以外の列名と一致することはできません。

    column_type

    対象

    順序を変更する列の元のデータ型。 パラメーターは変更できません。

    column_name

    対象

    順序を変更する列をcolumn_nameの後に配置します。

  • --修改表sale_detail的列customer_id为customer并位于total_price之后。
    --Modify the table sale_detail to change the column name customer_id to customer and place it after the total_price column.
    ALTER TABLE sale_detail change customer_id customer string after total_price;
    --Modify the table sale_detail to move the column customer_id after the total_price column without changing its name.
    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

    対象

    列の新しい名前。 列名は重複できません。

  • --Modify the table sale_detail to change the column_name from customer_name to 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

    対象

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

  • --Modify the comment for the customer column in 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

    対象

    名前とコメントを変更する列の名前。

    説明

    列が存在する必要があります。

    new_col_name

    対象

    列の新しい名前。 列名は重複できません。

    column_type

    対象

    列のデータ型。

    col_comment

    任意

    列の新しいコメント。The new comment of the column. コメントは、長さが1,024バイトを超えない有効な文字列である必要があります。

  • --Modify the table sale_detail to rename the column customer_name to customer_newname and add its comment 'customer'.
    ALTER TABLE sale_detail change COLUMN customer_name customer_newname STRING comment 'customer';

非パーティション列のnull非許容プロパティの変更

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

desc extended table_name; コマンドを実行して、Nullableプロパティの値を表示できます。 Nullabletrueの場合、列の値はnullになります。 Nullablefalseの場合、列の値をnullにすることはできません。

  • 制限事項

    Nullableプロパティの値をtrueに変更した後、プロパティ設定を元に戻すことはできません。

  • 構文

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

    パラメーター

    必須 / 任意

    説明

    table_name

    対象

    Nullableプロパティの値を変更するテーブルの名前。

    old_col_name

    対象

    Nullableプロパティを変更するパーティション以外の列の名前。

    説明

    列は既存の非パーティション列である必要があります。

  • --Create a partition table and the column id cannot be null.
    CREATE TABLE null_test(id int NOT NULL, name string) partitioned BY (ds string);
    --Modify the id column in the table to allow null values.
    ALTER TABLE null_test change COLUMN id NULL;

関連ドキュメント

テーブル操作コマンドの詳細については、以下をご参照ください。