関数の定義:
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;