私はちょうど同じ質問に答えることを試みて走りました、そして、それは役に立ちましたが、かなり完全ではありませんでした。短い答えは「はい」です。質問のようなものは動作しますが、構文は正しくはありません。ちょうどいくつかの例の列です
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
:
では、次のステートメントを使用して作成された3つのテーブルを持っていると言います。
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;
これは、約hereについて読むことができる動的パーティショニングと呼ばれるプロセスを使用します。重要なことは、どの列がどのパーティションに関連付けられているかがSELECT命令によって決定されることです。すべての動的パーティションは、最後と順番に選択する必要があります。
上記のコードを実行しようとすると、設定したプロパティのためにエラーが発生する可能性があります。あなたが動的なパーティションの前に少なくとも一つの静的パーティションに分割されていない場合、その後、あなたがエラーを打つかもしれない
set hive.exec.dynamic.partition=true;
:あなたがそうすることを確認してください無効に動的パーティショニングを持っている場合はまず、それが動作しません。この制限は、サブパーティションを動的パーティションで上書きしようとしているときに、誤ってルートパーティションを削除するのを防ぎます。私の経験では、この行動は一度も役に立たず、しばしば迷惑でしたが、あなたの走行距離は変わるかもしれません。いずれにしても、変更するのは簡単です:
set hive.exec.dynamic.partition.mode=nonstrict;
そしてそれはそうするべきです。