MaxComputeでは、既存のテーブルのパーティションに対して操作を実行できます。 たとえば、ビジネス要件に基づいて、パーティションを追加したり、パーティションを削除したり、パーティションキー列の値を変更したりできます。
次の表に、MaxComputeテーブルのパーティションに対する操作を示します。
操作 | 説明 | 承認済みユーザー | 操作プラットフォーム |
既存のパーティション分割テーブルにパーティションを追加します。 | テーブルに対するAlter権限を持つユーザー | このトピックで説明されているステートメントは、次のプラットフォームで実行できます。 | |
パーティションテーブルのパーティションの | |||
パーティションキー列の値を変更します。 | |||
パーティションテーブルの複数のパーティションを1つのパーティションにマージします。 この操作は、マージされたパーティションに関するディメンション情報を削除し、指定されたパーティションにパーティションデータを転送します。 | |||
テーブルのすべてのパーティションを一覧表示します。 | |||
パーティションテーブルに関するパーティション情報を表示します。 | |||
既存のパーティションテーブルからパーティションを削除します。 | |||
指定されたパーティションからデータをクリアします。 |
制限事項
MaxComputeテーブルのパーティションキー列として構成できるのは、TINYINT、SMALLINT、INT、BIGINT、CHAR、VARCHAR、およびSTRINGデータ型の列のみです。
MaxComputeテーブルには、最大6レベルのパーティションを含めることができます。
MaxComputeテーブルには、最大60,000個のパーティションを含めることができます。
MaxComputeでは、一度に最大10,000個のパーティションのデータをクエリできます。
パーティション分割トランザクションテーブルのパーティションをマージすることはできません。
パーティション分割されていないDeltaテーブルのデータをクリアしたり、Deltaテーブルのwrite.bucket.numプロパティを変更したりすることはできません。
パーティションの追加
既存のパーティション分割テーブルにパーティションを追加します。
制限事項
マルチレベルパーティションを持つテーブルにパーティションキー列の値を追加するには、すべてのパーティションを指定する必要があります。
この操作では、パーティションキー列の値のみを追加できます。 パーティションキー列の名前は追加できません。
構文
ALTER TABLE <table_name> ADD [IF NOT EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...];パラメーター
パラメーター
必須 / 任意
説明
table_name
対象
パーティションを追加するパーティション分割テーブルの名前。
存在しない場合
非対象
[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は、パーティションキー列の値を示します。 パーティションキー列の名前は大文字と小文字を区別しませんが、値は大文字と小文字を区別します。例
sale_detailテーブルはこのセクションで使用されます。 このテーブルのCREATE TABLEステートメントの詳細については、「sale_detailという名前のテーブルの作成」をご参照ください。
例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テーブルにパーティションを追加し、パーティションのパーティションキー列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");
パーティションの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 the partition key column values of the sale_detail table. ALTER TABLE sale_detail PARTITION (sale_date = '201312', region = 'hangzhou') rename TO PARTITION (sale_date = '201310', region = 'beijing');
パーティションの結合Merge partitions
パーティションテーブルの複数のパーティションを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が指定されているが、
マージ条件を満たすパーティションがない場合、マージ後に新しいパーティションを生成することはできません。 マージプロセス中にinsert、rename、dropなどの操作によってソースデータが変更された場合、If EXISTSが指定されていてもエラーが返されます。述語
対象
マージするパーティションを一致させるために使用される条件。
fullpartitionSpec
対象
マージ後に生成されるパーティション。
パージ
非対象
オプションのキーワード。 このパラメーターを設定すると、セッションディレクトリはクリアされます。 デフォルトでは、過去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 merging. SHOW partitions intpstringstringstring; ds=20181101/hh=00/mm=00 ds=20181101/hh=10/mm=00 ds=20181101/hh=10/mm=10例2: 指定したパーティションを1つのパーティションにマージします。
-- 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 partitions in the partitioned table. SHOW partitions intpstringstringstring; ds=20181101/hh=00/mm=00
リストパーティション
テーブルのすべてのパーティションを一覧表示します。 テーブルが存在しないか、テーブルがパーティション分割されていないテーブルである場合、エラーが返されます。
構文
SHOW PARTITIONS <table_name>;パラメーター
table_name: 必須です。 パーティション情報を表示するパーティションテーブルの名前。
例
-- List all the partitions of the sale_detail table. SHOW PARTITIONS sale_detail;次の結果が返されます。
sale_date=2023/region=china sale_date=2024/region=shanghai
パーティション情報の表示
パーティションテーブルに関するパーティション情報を表示します。
構文
DESC <table_name> PARTITION (<pt_spec>);パラメーター
パラメーター
必須 / 任意
説明
table_name
対象
パーティション情報を表示するパーティションテーブルの名前。
pt_spec
対象
表示するパーティションに関する情報。 このパラメーターの値は、
partition_col1=col1_value1, partition_col2=col2_value1...形式です。 テーブルに複数レベルのパーティションがある場合は、すべてのパーティションキー列の値を指定する必要があります。例
-- View the partition information about the partitioned table sale_detail. DESC sale_detail PARTITION (sale_date='201312',region='hangzhou');次の結果が返されます。
+------------------------------------------------------------------------------------+ | PartitionSize: 1234 | +------------------------------------------------------------------------------------+ | CreateTime: 2024-11-14 16:43:22 | | LastDDLTime: 2024-11-14 16:45:37 | | LastModifiedTime: 2024-11-14 16:45:37 | +------------------------------------------------------------------------------------+ OK
パーティションの削除
既存のパーティションテーブルからパーティションを削除します。
MaxComputeでは、指定されたフィルター条件に基づいてパーティションを削除できます。 指定したフィルター条件を満たす複数のパーティションを一度に削除する場合は、式を使用してフィルター条件を指定し、フィルター条件を使用してパーティションを一致させ、パーティションを一度に削除できます。
制限事項
partition (<partition_filtercondition>) 句で指定できるパーティションキー列は1つだけです。
式を使用してPARTITION (<partition_filtercondition>) を指定する場合、式には組み込みのスカラー関数のみを使用できます。
注意事項
パーティションを削除すると、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オプションを指定せず、指定されたパーティションが存在しない場合、エラーが返されます。
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
非対象
The filter condition. このパラメーターは、フィルター条件を指定するときに必要です。 大文字と小文字は区別されません。 形式:
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. CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) partitioned BY (sale_date STRING); -- Add a partition 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 multiple 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 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 or 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 partitions 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 a 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');
パーティションからデータを消去する
パーティションテーブルの指定されたパーティションからデータをクリアします。
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
非対象
The filter condition. このパラメーターは、フィルター条件を指定するときに必要です。 大文字と小文字は区別されません。 形式:
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;
関連ドキュメント
テーブル操作の詳細については、次のトピックを参照してください。