MaxComputeは、列の追加や削除、列データ型の変更など、既存のテーブルに対する列の変更操作をサポートしています。 実際のビジネスシナリオに基づいて、対応する操作を実行できます。
MaxCompute SQLの列操作コマンドは次のとおりです。
操作 | 特徴 | ロール | 操作エントリ |
既存のパーティションテーブルまたは非パーティションテーブルに列またはコメントを追加します。 | テーブルに対するAlter権限を持つユーザー | このトピックで説明されているステートメントは、次のプラットフォームで実行できます。 | |
既存のパーティションテーブルまたは非パーティションテーブルから列を削除します。 | |||
既存の列のデータ型を変更します。 | |||
テーブル内の指定した列の順序を変更します。 | |||
既存のパーティションテーブルまたは非パーティションテーブルの列の名前を変更します。 | |||
既存のパーティションテーブルまたは非パーティションテーブルの列のコメントを変更します。 | |||
既存のパーティションテーブルまたは非パーティションテーブルの列の名前とコメントを同時に変更します。 | |||
テーブルのパーティション以外のキー列の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_nameはnew_column_nameと同じにすることができます。これは、列名が変更されていないことを示します。 ただし、new_column_nameはold_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_nameはold_column_nameと同じにすることができます。 ただし、new_col_nameはold_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
プロパティの値を表示できます。 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プロパティを変更するパーティション以外の列の名前。
説明列は既存の非パーティション列である必要があります。
例
--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;
関連ドキュメント
テーブル操作コマンドの詳細については、以下をご参照ください。