2011-07-08 6 views
4

既存のフィールドの挿入時にハイブテーブルを分割することはできますか?パーティション既存フィールドによるハイブテーブル?

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

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

ありがとう!

トラヴィス

答えて

-1

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

0

私はこのことについて、スーパーわからないんだけど、このような何かが

INSERT OVERWRITE TABLE tealeaf_event 
SELECT col1 as tealeaf_col1, ..., datestring as ds; 
1

を働くかもしれないが多分これはすでに答えている...しかし、あなたが述べたようにはい、あなたは正確に行うことができます。私は何度もそれをやりました。明らかに、新しいテーブルは元のテーブルと同様に定義する必要がありますが、パーティションカラムはなく、パーティション仕様も必要です。また、元のテーブルの列を明示的に一覧表示する必要があるかどうか、またはアステリックが十分であるかどうかを覚えていません。

9

私はちょうど同じ質問に答えることを試みて走りました、そして、それは役に立ちましたが、かなり完全ではありませんでした。短い答えは「はい」です。質問のようなものは動作しますが、構文は正しくはありません。ちょうどいくつかの例の列です

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); 

ab

では、次のステートメントを使用して作成された3つのテーブルを持っていると言います。 dthourは、本番表に到達するとパーティション化する値です。ステージングデータを staging_unpartitionedstaging_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; 

そしてそれはそうするべきです。