1 つのソーステーブルから複数の送信先テーブルまたはパーティションにデータを書き込む必要がある場合、MULTI INSERT を使用すると、単一の SQL ステートメントでこれを実行できます。
以下のいずれかのプラットフォームで MULTI INSERT ステートメントを実行できます:
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
各送信先テーブルに対する ALTER 権限
ソーステーブルのメタデータに対する DESCRIBE 権限
権限の付与方法については、「MaxCompute の権限」をご参照ください。
制限事項
単一の
MULTI INSERTステートメントでは、最大 255 個のINSERT操作をサポートします。この上限を超えると構文エラーが発生します。パーティションテーブル内の各送信先パーティションは、ステートメント全体のすべての
INSERT操作で 1 回のみ指定できます。非パーティション化テーブルは、ステートメント全体のすべての
INSERT操作で 1 回のみ指定できます。
構文
-- 1 回のソーススキャンから複数の送信先へ挿入
FROM <from_statement>
INSERT OVERWRITE | INTO TABLE <table_name1> [PARTITION (<pt_spec1>)]
<select_statement1>
INSERT OVERWRITE | INTO TABLE <table_name2> [PARTITION (<pt_spec2>)]
<select_statement2>
...;| パラメーター | 必須 | 説明 |
|---|---|---|
from_statement | はい | データソース(例:ソーステーブル名)を指定する FROM 句です。 |
table_name | はい | 送信先テーブルの名前です。 |
pt_spec | いいえ | データを書き込むパーティションです。定数のみ許可され、式および関数は使用できません。フォーマット: (partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。各 INSERT 操作は異なるパーティションを対象とする必要があります。 |
select_statement | はい | 挿入するデータを読み取る SELECT 句です。 |
注意事項
開発中に全表スキャンを有効にするには、セッション開始時に
set odps.sql.allow.fullscan=true;を実行します。
サンプル
複数のパーティションへの挿入
このサンプルでは、送信先テーブルを作成し、sale_detail から取得した販売データを、単一のステートメントで sale_detail_multi の 2 つの別々のパーティションに挿入します。
-- ソーステーブルと同じスキーマを持つ送信先テーブルを作成
CREATE TABLE sale_detail_multi LIKE sale_detail;
-- このセッションで全表スキャンを有効化した後、2 つのパーティションに一度に挿入
SET odps.sql.allow.fullscan=true;
FROM sale_detail
INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2010', region='china')
SELECT shop_name, customer_id, total_price
INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2011', region='china')
SELECT shop_name, customer_id, total_price;
-- 結果を確認
SET odps.sql.allow.fullscan=true;
SELECT * FROM sale_detail_multi;期待される出力:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2010 | china |
| s2 | c2 | 100.2 | 2010 | china |
| s3 | c3 | 100.3 | 2010 | china |
| s1 | c1 | 100.1 | 2011 | china |
| s2 | c2 | 100.2 | 2011 | china |
| s3 | c3 | 100.3 | 2011 | china |
+------------+-------------+-------------+------------+------------+重複パーティション — エラー事例
以下のステートメントは失敗します。2 つの INSERT 操作が同一のパーティション (sale_date='2010', region='china') を対象としているためです。各パーティションは、1 つの MULTI INSERT ステートメント内で 1 回のみ指定できます。
-- エラー:単一の MULTI INSERT ステートメント内で同一のパーティションを複数回指定することはできません
FROM sale_detail
INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2010', region='china')
SELECT shop_name, customer_id, total_price
INSERT OVERWRITE TABLE sale_detail_multi PARTITION (sale_date='2010', region='china')
SELECT shop_name, customer_id, total_price;例 3:同一テーブルの異なるパーティションに対して、単一のステートメント内で insert overwrite と insert into を併用することはできません。この操作はエラーを引き起こします。以下は 誤ったコマンド例 です。
from sale_detail
insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
select shop_name, customer_id, total_price
insert into table sale_detail_multi partition (sale_date='2011', region='china' )
select shop_name, customer_id, total_price;