MaxCompute は、既存のテーブルの列の追加、削除、名前変更、順序変更、および変更をサポートしています。
操作の概要
| 操作 | スキーマ進化が必要 | 説明 |
|---|---|---|
| 列またはコメントの追加 | はい | 既存のテーブルに列を追加 |
| 列の削除 | はい | テーブルから 1 つ以上の列を削除 |
| 列のデータ型の変更 | はい | 列を異なるデータ型に変換 |
| 列の順序の変更 | はい | 列を異なる位置に移動 |
| 列名の変更 | いいえ | 列の名前を変更 |
| 列のコメントの変更 | いいえ | 列のコメントを更新 |
| 列名とコメントの変更 | いいえ | 列の名前変更とコメントの更新を同時に実行 |
| 列の NOT NULL プロパティの変更 | いいえ | 非パーティションキー列に NULL 値を許可 |
サポートされるプラットフォーム
列操作コマンドは、次のいずれかのプラットフォームで実行します。
前提条件
開始する前に、以下があることを確認してください。
対象テーブルに対する Alter 権限。
プロジェクトレベルでスキーマ進化が有効になっていること (列の追加、列の削除、列のデータ型の変更、列の順序の変更にのみ必要です)。
スキーマ進化の有効化
次のコマンドを実行して、スキーマ進化を有効にします。
setproject odps.schema.evolution.enable=true;このパラメーターを設定できるのは、プロジェクトオーナー、または Super_Administrator か Admin ロールを持つユーザーのみです。 設定後、約 10 分で有効になります。 詳細については、「ユーザーへの組み込み管理ロールの割り当て」をご参照ください。
列またはコメントの追加
既存の非パーティションテーブルまたはパーティションテーブルに列を追加します。 新しい列はテーブルの末尾に追加されます。 MaxCompute は、STRUCT<x: STRING, y: BIGINT> や MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>> などの複雑なデータ型をサポートしています。
構文
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 | いいえ | 新しい列のコメント。 |
例
sale_detail テーブルに 2 つの列を追加します。
ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT);sale_detail テーブルにコメント付きの 2 つの列を追加します。
ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT 'Customer', education BIGINT COMMENT 'Education' );sale_detail テーブルに複雑なデータ型の列を追加します。
ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>);列が既に存在し、文に IF NOT EXISTS が含まれている場合、文は成功しますが、列は再度追加されません。
-- 文は成功しますが、ID 列は繰り返し追加されません。
ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint);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 つ以上の列を削除します。 プロンプトが表示されたら、yes と入力して削除を確認します。
構文
-- 単一の列を削除します。
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 列を削除します。
-- sale_detail テーブルから customer_id 列を削除します。 削除を確認するには yes と入力します。
ALTER TABLE sale_detail DROP COLUMN customer_id;DROP COLUMNS を使用して customer_id 列を削除します。
-- sale_detail テーブルから customer_id 列を削除します。 削除を確認するには yes と入力します。
ALTER TABLE sale_detail DROP COLUMNS customer_id;sale_detail テーブルから shop_name 列と customer_id 列を削除します。
-- sale_detail テーブルから shop_name 列と customer_id 列を削除します。 削除を確認するには yes と入力します。
ALTER TABLE sale_detail DROP COLUMNS shop_name, customer_id;列のデータ型の変更
既存の列のデータ型を変更します。
構文
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_data_type | はい | 列の新しいデータ型。 |
例
sale_detail テーブルの id フィールドのデータ型を BIGINT から STRING に変更します。
ALTER TABLE sale_detail CHANGE COLUMN id id STRING;データ型変換テーブル
Y は変換がサポートされていることを、N はサポートされていないことを示します。 - は、変換が適用できないことを示します。 Y() は、括弧内の条件を満たす場合に変換がサポートされることを示します。

列の順序の変更
既存の非パーティションテーブルまたはパーティションテーブル内の列を別の位置に移動します。 必要に応じて、同時に列の名前を変更することもできます。
構文
ALTER TABLE <table_name> CHANGE <old_column_name> <new_column_name> <column_type> AFTER <column_name>;パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
| table_name | はい | テーブルの名前。 |
| old_column_name | はい | 移動する列の現在の名前。 |
| new_col_name | はい | 列の新しい名前。 名前を変更しない場合は、old_column_name と同じ値を設定します。 この値は、他の既存の列名と一致させることはできません。 |
| column_type | はい | 列の元のデータ型。 これは変更できません。 |
| column_name | はい | 移動した列を配置する位置の直後にある列。 |
例
customer 列の名前を customer_id に変更し、total_price 列の後に移動します。
ALTER TABLE sale_detail CHANGE customer customer_id STRING AFTER total_price;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 バイトです。 |
例
customer 列の名前を customer_newname に変更し、そのコメントを 'customer' に設定します。
ALTER TABLE sale_detail CHANGE COLUMN customer customer_newname STRING COMMENT 'customer';列の NOT NULL プロパティの変更
非パーティションキー列に NULL 値を許可します。 この操作は元に戻せません。 NULL 値が許可されると、列を NOT NULL に戻すことはできません。
列が NULL 値を許可するかどうかを確認するには、DESC EXTENDED table_name; を実行し、Nullable フィールドを確認します。
true-- NULL 値が許可されます。false-- NULL 値は許可されません。
構文
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL;パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
| table_name | はい | テーブルの名前。 |
| old_col_name | はい | 変更する非パーティションキー列の名前。 列は存在している必要があります。 |
例
id 列に NOT NULL 制約を持つパーティションテーブルを作成し、NULL 値を許可します。
-- 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 | |
+------------------------------------------------------------------------------------+スキーマ進化の制限事項
スキーマ進化操作 (列の順序変更、列の追加と順序変更、または列の削除) がテーブルを変更すると、特定のジョブタイプの読み取りと書き込みの動作が変更されます。
| ジョブタイプ | 読み取り | 書き込み |
|---|---|---|
| MapReduce 1.0 / Graph タスク | サポートされていません | サポートされていません |
| CUPID Spark (Spark-2.3.0-odps0.34.0 または Spark-3.1.1-odps0.34.0) | サポートされています | サポートされていません |
| PAI ジョブ | サポートされています | サポートされていません |
| Hologres (1.3 より前のバージョン、外部テーブル) | サポートされていません | サポートされていません |
追加の制限事項:
スキーマ進化が発生した後、CLONE TABLE はサポートされません。
スキーマ進化が発生した後、Streaming Tunnel はエラーを報告します。