同じ質問に答えようとしてこれに出くわしましたが、役に立ちましたが、完全ではありませんでした。簡単な答えはイエスです。質問のクエリのようなものは機能しますが、構文が正しくありません。
次のステートメントを使用して作成された 3 つのテーブルがあるとします。
CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);
CREATE TABLE staging_partitioned (a int, b int)
PARTITIONED BY (datestring string, hour int);
CREATE TABLE production_partitioned (a int, b int)
PARTITIONED BY (dt string, hour int);
列a
と列b
は、列の例にすぎません。dt
およびhour
は、本番テーブルに到達したときにパーティション分割する値です。ステージング データを本番環境に移動するstaging_unpartitioned
と、staging_partitioned
まったく同じように見えます。
INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_unpartitioned;
INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_partitioned;
これは、ここで読むことができる動的パーティショニングと呼ばれるプロセスを使用します。注意すべき重要なことは、どの列がどのパーティションに関連付けられるかは、SELECT の順序によって決定されるということです。すべての動的パーティションは、最後に順番に選択する必要があります。
上記のコードを実行しようとすると、設定したプロパティが原因でエラーが発生する可能性が高くなります。まず、動的パーティショニングが無効になっている場合は機能しないため、次のことを確認してください。
set hive.exec.dynamic.partition=true;
次に、動的パーティションの前に少なくとも 1 つの静的パーティションでパーティション分割していないと、エラーが発生する可能性があります。この制限により、サブパーティションを動的パーティションで上書きするつもりだったときに、誤ってルート パーティションを削除することがなくなります。私の経験では、この動作は決して役に立たず、しばしば迷惑でしたが、マイレージは異なる場合があります. いずれにせよ、変更は簡単です。
set hive.exec.dynamic.partition.mode=nonstrict;
そして、それはそれを行う必要があります。