関数の定義:
INSERT OVERWRITE|INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [(col1,col2 ...)]
select_statement
FROM from_statement;
注
- MaxCompute の INSERT 構文は、MySQL や Oracle の INSERT 構文とは異なります。 insert overwrite、insert into に続けて、TABLE キーワードを指定します。tablename をそのまま使用しません。
- INSERT の書き込み先のテーブルがパーティションテーブルの場合、
[PARTITION (partcol1=val1, partcol2=val2 …)]
には、関数などの式を指定できません。 - 現時点では、INSERT OVERWRITE で列を挿入することはできません。 代わりに INSERT INTO を使用します。
INSERT OVERWRITE および INSERT INTO の処理結果は、最終テーブルに保存されます。
INSERT INTO と INSERT OVEWRITE の違いは、INSERT INTO は、テーブルやパーティションに追加データが挿入されるのに対し、INSERT OVERWRITE は、テーブルやパーティションから元のデータを削除してからデータが挿入されます。
注 同一パーティションに対して、値を指定した INSERT OVERWRITE を繰り返し実行すると、MaxComputer のパーティションテーブルのパーティションサイズは、異なるデータパーティションサイズになります。
これは、同じテーブルの同じパーティションを選択して、同じテーブルの同じパーティションに INSERT OVERWRITE を実行すると、ファイル分割ロジックが変わり、データのサイズが変わるためです。
しかし、データの合計長は、INSERT OVERWRITE 前後では一定なので、料金やストレージを心配する必要はありません。
MaxCompute SQL でデータを処理する際に、最もよく使用される文が INSERT OVERWRITE および INSERT INTO です。 処理結果をテーブルに保存することができるため、後続の処理に使用できます。たとえば、sale_detail テーブルで、異なるリージョンの売上詳細を処理するには、次の文を実行します。
create table sale_detail_insert like sale_detail;
alter table sale_detail_insert add partition(sale_date='2013', region='china');
insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')
select shop_name, customer_id, total_price from sale_detail;
注 元のテーブルと結果テーブルとの対応づけには、SELECT 句内の列の順序が適用されます。両テーブルの列名が適用されるわけではありません。 次の SQL 文も有効です。
insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')
select customer_id, shop_name, total_price from sale_detail;
-- sale_detail_insert テーブルの作成時、列の順序は次のとおりです。
-- shop_name string、customer_id string、total_price bigint
-- sale_detail のデータを sale_detail_insert に挿入する際、sale_detail の挿入順序は次のとおりです。
-- customer_id、shop_name、total_price
-- sale_detail.customer_id のデータを sale_detail_insert.shop_name に挿入します。
-- sale_detail.shop_name のデータを sale_detail_insert.customer_id に挿入します。
パーティションにデータを挿入する場合、SELECT リストにパーティション列を指定することはできません。
insert overwrite table sale_detail_insert partition (sale_date='2013', region='china')
select shop_name, customer_id, total_price, sale_date, region from sale_detail;
-- エラーが返されます。 項目 sale_date と region はパーティション列です。静的パーティションの INSERT 文には指定できません。
また、パーティションの値には、定数のみを指定します。式は指定できません。 次の文は無効です。
insert overwrite table sale_detail_insert partition (sale_date=datepart('2016-09-18 01:10:00', 'yyyy') , region='china')
select shop_name, customer_id, total_price from sale_detail;