7

既存のフィールドによる挿入時に Hive テーブルを分割できますか?

日付フィールドと時間フィールドを持つ 10 GB のファイルがあります。このファイルをテーブルにロードし、それらのフィールドをパーティションとして使用する別のパーティション テーブルに挿入して上書きすることはできますか? 次のようなものは機能しますか?

INSERT OVERWRITE TABLE tealeaf_event  PARTITION(dt=evt.datestring,hour=evt.hour) 
SELECT * FROM staging_event evt;

ありがとう!

トラヴィス

4

4 に答える 4

15

同じ質問に答えようとしてこれに出くわしましたが、役に立ちましたが、完全ではありませんでした。簡単な答えはイエスです。質問のクエリのようなものは機能しますが、構文が正しくありません。

次のステートメントを使用して作成された 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;

そして、それはそれを行う必要があります。

于 2013-03-07T19:34:30.583 に答える
1

たぶんこれはすでに答えられています...しかし、はい、あなたが述べたとおりに行うことができます。私は何度もそれをしました。明らかに、新しいテーブルは元のテーブルと同様に定義する必要がありますが、パーティション列がなく、パーティション仕様があります。また、元のテーブルの列を明示的にリストする必要があったのか、アスタリスクで十分だったのか思い出せません。

于 2012-01-17T18:11:38.040 に答える
0

これについてはよくわかりませんが、このようなものがうまくいくかもしれません

INSERT OVERWRITE TABLE tealeaf_event
SELECT col1 as tealeaf_col1, ..., datestring as ds;
于 2011-09-23T15:56:55.940 に答える
-1

いいえ。そのフィールドを削除するか、少なくとも名前を変更する必要があります。

于 2011-07-09T02:27:42.000 に答える