MaxComputeでは、既存のテーブルのパーティションと列で操作を実行できます。 たとえば、ビジネス要件に基づいて、パーティションの追加、列の追加、列の削除、列のデータ型の変更を行うことができます。
次の表に、MaxComputeテーブルのパーティションまたは列の操作に使用できるステートメントを示します。
タイプ | 操作 | 説明 | 承認済みユーザー | 操作プラットフォーム |
パーティション操作 | 既存のパーティション分割テーブルにパーティションを追加します。 | テーブルに対するAlter権限を持つユーザー | このトピックで説明されているステートメントは、次のプラットフォームで実行できます。 | |
既存のパーティションテーブルからパーティションを削除します。 | ||||
パーティションテーブルのパーティションの | ||||
パーティションテーブルのパーティションキー列の値を変更します。 | ||||
パーティションテーブルの複数のパーティションを1つのパーティションにマージします。 この操作は、マージされたパーティションに関するディメンション情報を削除し、指定されたパーティションにパーティションデータを転送します。 | ||||
指定されたパーティションからデータをクリアします。 | ||||
列操作 | 列または列コメントを既存の非パーティションテーブルまたはパーティションテーブルに追加します。 | |||
既存の非パーティションテーブルまたはパーティションテーブルから列を削除します。 | ||||
既存の列のデータ型を変更します。 | ||||
テーブル内の指定された列のシーケンスを変更します。 | ||||
既存の非パーティションテーブルまたはパーティションテーブルの列の名前を変更します。 | ||||
既存の非パーティションテーブルまたはパーティションテーブルの列のコメントを変更します。 | ||||
既存の非パーティションテーブルまたはパーティションテーブルの列の名前とコメントを同時に変更します。 | ||||
テーブル内のパーティション以外のキー列の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を指定してもエラーが返されます。 ステートメントは、INSERT
、RENAME
、または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;
関連ドキュメント
テーブル操作の詳細については、「テーブル操作」をご参照ください。