MaxCompute では、既存のテーブルのパーティションに対して、パーティションの追加、削除、値の変更などの操作を実行できます。これらの操作は必要に応じて実行できます。
機能インデックス
以下は、パーティション操作のための MaxCompute SQL コマンドです。
操作 | 機能 | ロール | エントリポイント |
既存のパーティションテーブルに新しいパーティションを追加します。 | テーブルに対する Alter 権限を持つユーザー | このトピックのコマンドは、次のプラットフォームで実行できます。 | |
パーティションテーブル内のパーティションの | |||
パーティションテーブル内のパーティションの値を変更します。 | |||
テーブルの複数のパーティションを単一のパーティションにマージします。この操作は、ソースパーティションのディメンション情報を削除し、データを宛先パーティションに移動します。 | |||
テーブル内のすべてのパーティションをリスト表示します。 | |||
パーティションテーブル内の特定のパーティションに関する情報を表示します。 | |||
既存のパーティションテーブルからパーティションを削除します。 | |||
指定されたパーティションからデータをクリアします。 |
適用範囲
データ型:TINYINT、SMALLINT、INT、BIGINT、CHAR、VARCHAR、STRING のデータ型のフィールドをパーティションキー列として使用できます。
単一テーブルのパーティションレベル:テーブルは最大 6 レベルのパーティションを持つことができます。
単一テーブルのパーティション数:テーブルは最大 60,000 個のパーティションを持つことができます。
一度にクエリできる最大パーティション数:一度に最大 10,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
はい
追加するパーティション。フォーマットは
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)です。partition_col はパーティションフィールドで、partition_col_value はパーティション値です。パーティションフィールドでは大文字と小文字は区別されません。パーティション値では大文字と小文字が区別されます。例
sale_detailという名前のパーティションテーブルを作成できます。テーブルの作成と削除の詳細については、「テーブルの作成と削除」をご参照ください。CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING, region STRING);例 1:
sale_detailテーブルに、2025 年 12 月の杭州リージョンの販売レコードを格納するためのパーティションを追加します。ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='hangzhou');例 2:
sale_detailテーブルに 2 つのパーティションを同時に追加して、2025 年 12 月の北京および上海リージョンの売上レコードを格納します。ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='beijing') PARTITION (sale_date='202512', region='shanghai');例 3:
sale_detailテーブルにパーティションを追加し、sale_dateパーティションフィールドのみを指定します。この操作ではエラーが返されます。sale_dateとregionの両方のパーティションフィールドを指定する必要があります。ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='20260111'); -- 次のエラーメッセージが返されます: FAILED: ODPS-0130071:[1,58] Semantic analysis exception - provided partition spec does not match table partition spec例 4:Delta Lake テーブルにパーティションを追加します。
-- Delta Lake テーブルを作成します。 CREATE TABLE delta_table_test_par ( pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL) PARTITIONED BY (dd STRING, hh STRING) TBLPROPERTIES ("transactional"="true"); -- パーティションを追加します。 ALTER TABLE delta_table_test_par ADD PARTITION (dd='01', hh='01'); CREATE TABLE delta_table_test_nonpar ( pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL) TBLPROPERTIES ("transactional"="true");例 5:PK Delta Lake テーブルのプロパティを変更します。
-- パーティション化されたプライマリーキー (PK) Delta Lake テーブルのバケット数を更新します。 ALTER TABLE delta_table_test_par SET tblproperties("write.bucket.num"="64"); -- パーティション化されていない PK Delta Lake テーブルのバケット数を更新します。更新後、既存データは新しいバケット数に基づいて再分散されます。 ALTER TABLE delta_table_test_nonpar REWRITE tblproperties("write.bucket.num"="128"); -- retain プロパティを更新します。このプロパティは、Time Travel を使用してデータの履歴状態をクエリできる時間範囲 (時間単位) を指定します。 ALTER TABLE delta_table_test_par SET tblproperties("acid.data.retain.hours"="60");
パーティションの最終更新日時の更新
MaxCompute SQL は、パーティションテーブル内のパーティションの LastModifiedTime を更新する touch 操作を提供します。この操作は LastModifiedTime を現在時刻に変更します。これにより、MaxCompute はデータが変更されたと見なし、そのライフサイクルを再計算します。
制限事項
複数レベルのパーティションテーブルの場合、すべてのパーティションキー列の値を指定する必要があります。
コマンドフォーマット
ALTER TABLE <table_name> touch PARTITION (<pt_spec>);パラメーター
パラメーター
必須
説明
table_name
はい
パーティションを更新するパーティションテーブルの名前。テーブルが存在しない場合、エラーが返されます。
pt_spec
はい
最終更新日時を更新するパーティションに関する情報。フォーマットは
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)です。partition_col はパーティションフィールドで、partition_col_value はパーティション値です。指定されたパーティションフィールドまたはパーティション値が存在しない場合、エラーが返されます。例
-- sale_detail テーブルの sale_date='202512', region='shanghai' パーティションの LastModifiedTime を更新します。 ALTER TABLE sale_detail touch PARTITION (sale_date='202512', region='shanghai');
パーティション値の変更
MaxCompute SQL は、パーティションテーブルのパーティション値を変更するために、rename 操作をサポートしています。
制限事項
パーティションキー列の名前は変更できません。パーティションキー列に対応する値のみを変更できます。
複数レベルのパーティションテーブルの場合、すべてのパーティションキー列の値を指定する必要があります。
コマンドフォーマット
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
はい
変更後のパーティションに関する情報。フォーマットは
(partition_col1 = new_partition_col_value1, partition_col2 = new_partition_col_value2, ...)です。partition_col はパーティションフィールドで、new_partition_col_value は新しいパーティション値です。例
-- sale_detail テーブルのパーティション値を変更します。 ALTER TABLE sale_detail PARTITION (sale_date = '201312', region = 'hangzhou') rename TO PARTITION (sale_date = '201310', region = 'beijing');
パーティションのマージ
MaxCompute SQL では、merge partition 操作を使用してパーティションテーブルのパーティションをマージできます。この操作は、同じテーブルの複数のパーティションを 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条件を満たすパーティションがない場合、新しいパーティションは作成されません。実行中にソースデータがinsert、rename、またはdropなどの操作によって同時に変更された場合、IF EXISTS を指定していてもエラーが返されます。predicate
はい
マージされるパーティションが満たすべき条件。
fullpartitionSpec
はい
宛先パーティションに関する情報。
purge
いいえ
オプションのキーワード。このキーワードを指定すると、セッションディレクトリがクリアされます。デフォルトでは、過去 3 日以内のログがクリアされます。詳細については、「パージ」をご参照ください。
例
例 1:指定された条件を満たすパーティションを宛先パーティションにマージします。
-- パーティションテーブルのパーティションを表示します。 SHOW PARTITIONS sale_detail; -- 結果のサンプル: sale_date=202512/region=beijing sale_date=202512/region=shanghai sale_date=202602/region=beijin --sale_date='201512' 条件を満たすすべてのパーティションを sale_date='202601', region='hangzhou' パーティションにマージします。 ALTER TABLE sale_detail MERGE PARTITION(sale_date='202512') overwrite PARTITION(sale_date='202601', region='hangzhou'); --マージ後のパーティションを表示します。 SHOW PARTITIONS sale_detail; -- 結果のサンプル: sale_date=202601/region=hangzhou sale_date=202602/region=beijing例 2:複数の指定されたパーティションを宛先パーティションにマージします。
-- 複数の指定されたパーティションをマージします。 ALTER TABLE sale_detail MERGE IF EXISTS PARTITION(sale_date='202601', region='hangzhou'), PARTITION(sale_date='202602', region='beijing') overwrite PARTITION(sale_date='202603', region='shanghai') purge; -- パーティションテーブルのパーティションを表示します。 SHOW PARTITIONS sale_detail; -- 結果のサンプル: sale_date=202603/region=shanghai
全パーティションのリスト表示
テーブル内のすべてのパーティションをリスト表示できます。テーブルが存在しないか、パーティションテーブルでない場合、この操作はエラーを返します。
コマンドフォーマット
SHOW PARTITIONS <table_name>;パラメーター
table_name:必須。パーティションを表示するパーティションテーブルの名前。
例
-- sale_detail テーブルのすべてのパーティションをリスト表示します。 SHOW PARTITIONS sale_detail; -- 結果のサンプル: sale_date=202603/region=shanghai
パーティション情報の表示
パーティションテーブル内の特定のパーティションに関する情報を表示できます。
コマンドフォーマット
DESC <table_name> PARTITION (<pt_spec>);パラメーター
パラメーター
必須
説明
table_name
はい
パーティション情報を表示するパーティションテーブルの名前。
pt_spec
はい
表示するパーティションに関する情報。フォーマットは
partition_col1=col1_value1, partition_col2=col2_value1...です。複数レベルのパーティションテーブルの場合、すべてのパーティション値を指定する必要があります。例
-- sale_detail パーティションテーブルのパーティションの情報をクエリします。 DESC sale_detail PARTITION (sale_date='202603',region='shanghai'); -- 次の結果が返されます: +------------------------------------------------------------------------------------+ | PartitionSize: 0 | +------------------------------------------------------------------------------------+ | CreateTime: 2026-01-13 11:35:49 | | LastDDLTime: 2026-01-13 11:35:49 | | LastModifiedTime: 2026-01-13 11:35:49 | +------------------------------------------------------------------------------------+ OK
パーティションの削除
既存のパーティションテーブルからパーティションを削除できます。
MaxCompute では、フィルター条件に基づいてパーティションを削除できます。特定のルールを満たす複数のパーティションを一度に削除するには、式をフィルター条件として指定して、バッチ操作でパーティションを照合して削除できます。
制限事項
各パーティションフィルター句は、1 つのパーティションキー列にのみアクセスできます。
式で使用される関数は、組み込みスカラー関数である必要があります。
注意事項
パーティションを削除すると、MaxCompute プロジェクトのストレージ使用量が減少します。
MaxCompute のライフサイクル機能を使用して、古いパーティションを自動的に削除できます。
コマンドフォーマット
フィルター条件なし
-- 一度に 1 つのパーティションを削除します。 ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>; -- 一度に複数のパーティションを削除します。 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
はい
削除するパーティション。フォーマットは
(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) の値が処理され、指定された relational_operators に基づいて partition_col_value と比較されます。
パーティションフィルター条件は、論理演算子 NOT、AND、OR をサポートしています。NOT フィルター条件句を使用して、フィルタリングルールの補集合を取得できます。また、AND または OR 演算子を使用して複数のフィルター条件句を組み合わせて、全体的なパーティションマッチングルールを形成することもできます。
複数のパーティションフィルター句を指定できます。複数のパーティションフィルター句がカンマ (,) で区切られている場合、句は OR 論理演算子を使用して結合され、全体的なパーティションマッチングルールを形成します。
例
フィルター条件なし
-- sale_detail テーブルから 2026年3月の上海リージョンの販売レコードを含むパーティションを削除します。 ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202603',region='shanghai'); -- sale_detail テーブルから 2024年12月の杭州リージョンと上海リージョンの販売レコードを含む 2 つのパーティションを削除します。 ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202412',region='hangzhou'),PARTITION(sale_date='202412',region='shanghai');フィルター基準の指定
パーティションテーブル
-- パーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS sale_detail_del( shop_name STRING, customer_id STRING, total_price DOUBLE) partitioned BY (sale_date STRING); -- パーティションを追加します。 ALTER TABLE sale_detail_del 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'); -- パーティションをバッチで削除します。 ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911'); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date >= '202007'); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date LIKE '20191%'); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date IN ('202002','202004','202006')); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date BETWEEN '202001' AND '202007'); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(substr(sale_date, 1, 4) = '2020'); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201912' OR sale_date >= '202006'); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date > '201912' AND sale_date <= '202004'); ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(NOT sale_date > '202004'); -- 複数のパーティションフィルター式がサポートされています。式は OR 論理演算子を使用して結合されます。 ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911'), PARTITION(sale_date >= '202007'); -- 他のフォーマットでパーティションを追加します。 ALTER TABLE sale_detail_del ADD IF NOT EXISTS PARTITION (sale_date= '2019-10-05') PARTITION (sale_date= '2019-10-06') PARTITION (sale_date= '2019-10-07'); -- 正規表現を使用してパーティションを照合し、バッチでパーティションを削除します。 ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date RLIKE '2019-\\d+-\\d+');複数レベルのパーティションテーブル
-- 複数レベルのパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS region_sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) partitioned BY (sale_date STRING , region STRING ); -- パーティションを追加します。 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'); -- 次の文を実行して、複数レベルのパーティションテーブルからバッチでパーティションを削除します。2 つの照合条件は OR 論理演算子を使用して結合されます。sale_date が 201911 未満または region が beijing のすべてのパーティションが削除されます。 ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'),PARTITION(region = 'beijing'); -- sale_date が 201911 未満で、region が beijing のパーティションを削除するには、次のメソッドを使用します。 ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911', region = 'beijing');複数レベルのパーティションテーブルからバッチ操作でパーティションを削除する場合、
partitionフィルター句で複数のパーティションキー列に基づいて複合条件を作成してパーティションを照合することはできません。次の文はエラーメッセージを返します:FAILED: ODPS-0130071:[1,82] Semantic analysis exception - invalid column reference region, partition expression must have one and only one column reference。-- パーティションフィルター句は、1 つのパーティションキー列にのみアクセスできます。次の文はエラーを返します。 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
いいえ
フィルター条件を指定する場合に必須です。パーティションフィルター条件。このパラメーターでは大文字と小文字は区別されません。フォーマットは次のとおりです。
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) の値が処理され、指定された relational_operators に基づいて partition_col_value と比較されます。
パーティションフィルター条件は、論理演算子 NOT、AND、OR をサポートしています。NOT フィルター条件句を使用して、フィルタリングルールの補集合を取得できます。また、AND または OR 演算子を使用して複数のフィルター条件句を組み合わせて、全体的なパーティションマッチングルールを形成することもできます。
複数のパーティションフィルター句を指定できます。複数のパーティションフィルター句がカンマ (,) で区切られている場合、句は OR 論理演算子を使用して結合され、全体的なパーティションマッチングルールを形成します。
例
フィルター条件なし
-- sale_detail テーブルから 2026年1月の杭州リージョンの販売レコードを含むパーティションをクリアします。 TRUNCATE TABLE sale_detail PARTITION(sale_date='202601',region='hangzhou'); -- sale_detail テーブルから 2025年12月の杭州リージョンと上海リージョンの販売レコードを含む 2 つのパーティションをクリアします。 TRUNCATE TABLE sale_detail PARTITION(sale_date='202512',region='hangzhou'), PARTITION(sale_date='202512',region='shanghai');フィルター基準の指定
-- sale_detail テーブルから sale_date が 2025 で始まる杭州リージョンの販売レコードを含む複数のパーティションをクリアします。 TRUNCATE TABLE sale_detail PARTITION(sale_date LIKE '2025%' AND region='hangzhou');パーティション化されていない Delta Lake テーブルをクリアします。
-- パーティション化されていないテーブルをクリアします。テーブルはパーティション化されていないテーブルである必要があります。そうでない場合、エラーが返されます。 TRUNCATE TABLE non_par_table;
関連ドキュメント
テーブル操作コマンドの詳細については、次のトピックをご参照ください。