MaxCompute では、既存のテーブルの列を変更できます。 ビジネス要件に合わせて、列の追加、削除、データ型の変更が可能です。
コマンド
次の表に、列の操作に使用する MaxCompute SQL コマンドを示します。
アクション | 説明 | ロール | プラットフォーム |
既存の非パーティションテーブルまたはパーティションテーブルに列またはコメントを追加します。 | テーブルの Alter 権限を持つユーザー | これらのコマンドは、次のプラットフォームで実行できます: | |
既存の非パーティションテーブルまたはパーティションテーブルから列を削除します。 | |||
既存の列のデータ型を変更します。 | |||
テーブル内の指定した列の順序を調整します。 | |||
既存の非パーティションテーブルまたはパーティションテーブルの列名を変更します。 | |||
既存の非パーティションテーブルまたはパーティションテーブルの列のコメントを変更します。 | |||
既存の非パーティションテーブルまたはパーティションテーブルの列名とコメントを同時に変更します。 | |||
非パーティションキー列の NOT NULL プロパティを変更します。 |
注意事項
スキーマエボリューションには、複雑なデータ型を持つ列の追加、列の削除、列の順序変更、列のデータ型の変更などの操作が含まれます。 列の順序変更、列の追加後の順序変更、または列の削除を行うと、テーブルの読み書き動作に影響し、次の制限が適用されます:
ジョブタイプが 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 はサポートされません。
スキーマエボリューションが発生した場合、ストリーミングトンネルはエラーを返します。
列またはコメントの追加
既存の非パーティションテーブルまたはパーティションテーブルに列またはコメントを追加できます。 制約の詳細については、「注意事項」をご参照ください。 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:IF NOT EXISTS を使用して既存の列を追加しようとした場合、コマンドは列を再度追加することなく成功メッセージを返します。
-- ステートメントは成功しますが、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 分で有効になります。
構文
-- 単一の列を削除します。 ALTER TABLE <table_name> DROP COLUMN <col_name>; -- 複数の列を削除します。 ALTER TABLE <table_name> DROP COLUMNS <col_name1>[, <col_name2>...];パラメーター
table_name:必須。 変更するテーブルの名前。
col_name:必須。 削除する列の名前。
例
-- 例 1:sale_detail テーブルから customer_id 列を削除します。 ALTER TABLE sale_detail DROP COLUMN customer_id; -- 例 2:sale_detail テーブルから shop_name 列と total_price 列を削除します。 ALTER TABLE sale_detail DROP COLUMNS shop_name, total_price;
列のデータ型の変更
既存の列のデータ型を変更できます。 制約の詳細については、「注意事項」をご参照ください。
前提条件
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_name と new_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() は、括弧内の条件が満たされた場合に変換がサポートされることを意味します。

列の順序の変更
既存の非パーティションテーブルまたはパーティションテーブルの列の順序を変更できます。 制約の詳細については、「注意事項」をご参照ください。
前提条件
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_column_name
はい
列の新しい名前。
new_column_name と old_column_name に同じ名前を指定できます。その場合、列名は変更されません。 ただし、new_column_name を old_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
はい
新しいコメント。有効な文字列である必要があります。 最大長は 1,024 バイトです。
例
-- 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
任意
新しいコメント。 最大長は 1,024 バイトです。
例
-- 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 値を許可した後で、列を NULL 値を許可しない状態に戻すことはできません。
DESC EXTENDED table_name;コマンドを実行してNullableプロパティを表示し、列が NULL 値を許可するかどうかを確認します:Nullableがtrueの場合、NULL 値は許可されます。Nullableがfalseの場合、NULL 値は許可されません。
構文
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL;パラメーター
パラメーター
必須
説明
table_name
はい
変更するテーブルの名前。
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 | | +------------------------------------------------------------------------------------+
関連ドキュメント
テーブル操作の詳細については、次のトピックをご参照ください: