パーティションテーブルに INSERT OVERWRITE 操作を実行するには、文にパーティションの値を指定する必要があります。 または、パーティションテーブルのパーティション列のみを指定し、値は指定しないという柔軟な方法もあります。

概要

Select 句の列を使用して、パーティションの値を指定できます。

SQL 文の形式:
insert overwrite table tablename partition (partcol1, partcol2 ...) select_statement from from_statement;
  • 'select_statement' に続くフィールドにターゲットテーブルの動的パーティション値を指定します。 ターゲットテーブルが 1 レベルの動的パーティションの場合、select_statment の最後のフィールドの値が、ターゲットテーブルの動的パーティション値となります。
  • 現時点では、分散環境で各プロセスの出力できる動的パーティション数は最大 512 です。512 を超えると、エラーが発生します。
  • 現時点では、動的パーティション SQL で生成できる動的パーティションは、最大 2,000 です。2,000 を超えると、エラーが発生します。
  • 動的パーティションの値を NULL にすることはできません。また、特殊文字、漢字も使用できません。この制約に沿っていない場合は、例外が返されます。 例外:
    FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value:
                  province=xxx
  • ターゲットテーブルにマルチレベルパーティションがある場合、'INSERT 文' で一部のパーティションを静的パーティションに設定できます。ただし、静的パーティションは上位パーティションである必要があります。

動的パーティションについて説明するための簡単な例:
create table total_revenues (revenue bigint) partitioned by (region string);
    insert overwrite table total_revenues partition(region)
        select total_price as revenue, region
            from sale_detail;

上記の例のとおり、SQL を実行する前にどのパーティションが生成されるか、ユーザーにはわかりません。 SELECT 文の実行が完了しないと、region 値で作成されたパーティションがどれかユーザーは確認できません。 そのため、動的パーティションといいます。

その他の例:
create table sale_detail_dypart like sale_detail; --Create target table.
  • -- 例 1:
    insert overwrite table sale_detail_dypart partition (sale_date, region)
    select shop_name,customer_id,total_price,sale_date,region from sale_detail;
        -- 正常終了します。
    • 'sale_detail' テーブルの sale_date の値によって、ターゲットテーブルの sale_date パーティション値が決まります。また、region の値によって、ターゲットテーブルの region パーティションの値が決まります。
    • 動的パーティションでは、select_statement フィールドとターゲットテーブルの動的パーティションとの対応付けは、フィールドの順序で決まります。 たとえば、SELECT 文が次のように記述されているとします。
      select shop_name,customer_id,total_price,region,sale_date from
                sale_detail;
      region の値によってターゲットテーブルの sale_date パーティション値が決まり、sale_date の値によってターゲットテーブルの region パーティション値が決まります。
  • -- 例 2:
    insert overwrite table sale_detail_dypart partition (sale_date='2013', region)
            select shop_name,customer_id,total_price,region from sale_detail;
        -- 正常に終了します。マルチパーティション。セカンダリパーティションを指定します。
  • -- 例 3:
    insert overwrite table sale_detail_dypart partition (sale_date='2013', region)
            select shop_name,customer_id,total_price from sale_detail;
        -- エラー情報が返されます。 動的パーティションを挿入する場合、動的パーティション列を Select リストに含めなければなりません。
  • -- 例 4:
    insert overwrite table sales partition (region='china', sale_date)
    select shop_name,customer_id,total_price,sale_date from sale_detail;
        -- エラー情報が返されます。 下位のサブパーティションのみを指定することはできません。上位パーティションを動的に挿入する必要があります。
MaxCompute の旧バージョンでは、動的パーティション処理を行う場合に、パーティション列および対応する SELECT リストの型が同じでない場合には、エラーが報告されました。 MaxCompute 2.0 では、次のとおり、暗黙的変換が実行されます。
create table parttable(a int, b double) partitioned by (p string);
insert into parttable partition(p) select key, value, current_timestmap() from src;
select * from parttable;
結果は次のとおりです。
a b c
0 NULL 2017-01-23 22:30:47.130406621
0 NULL 2017-01-23 22:30:47.130406621