最初に行う必要があることは、テーブルを作成するときにどの列がパーティションであると予想されるかを明示的に伝えることです。 registry
あなたのパーティションにするには:あなたが望むよう
CREATE TABLE log(starttime STRING, thread STRING, session STRING, method STRING, targeturl STRING, ipaddress STRING, details STRING)
PARTITIONED BY (registry STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
をあなたはできるだけ多くのパーティションを追加することができ、各パーティションは、ネストされたサブフォルダになり、あなたがPARTITIONED BY
事項にパーティションを宣言する順序:最初の1トップレベルのパーティションになります、もう一つは、1つのレベルダウンになります...例:
|--- mytable
`---- mypartition1=x
`-------- mypartition2=x
`------- ...
私は何をするだろうことは次のとおりです。
の作成します外部表(まだ)ありませんパーティションに、すべてのデータをテーブルraw_log
を移入します全くのパーティション(ちょうど生ログファイルを含む)、で、あなたのログディレクトリの場所を指す:
CREATE EXTERNAL TABLE raw_log(starttime STRING, thread STRING, session STRING, method STRING, targeturl STRING, registry STRING, ipaddress STRING, details STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
LOCATION '/path/to/your/log/dir'
使用ハイブのダイナミックパーティションはraw_log
から読み取られ、log
に挿入しています:
FROM raw_log raw
INSERT OVERWRITE TABLE log PARTITION(registry)
SELECT raw.starttime, raw.thread, raw.session, raw.method, raw.targeturl, raw.ipaddress, raw.details
あなたがダイナミックパーティションon the official Apache wiki
の詳細を読むことができます
私はあなたのソリューションが好きです、そうするでしょう、私はあなたのソリューションを理解して、ありがとう!しかし、理解のために、私がraw_logを作成しなければ、col1、c2、c3 ... c10を持つデータ行がある場合、どのようにしてhiveに伝えますか?〜)どのようにcol c3またはc5をパーティションcolとして指定するのですか? – Integration
これは動的パーティションのクエリで行います。 'INSERT OVERWRITE TABLE log PARTITION(registry)'では、パーティション化されたログテーブルで、レジストリをパーティションカラムとして機能させることを指定しています。 パーティションレベルが複数ある場合は、代わりにPARTITION(c3、c5)を実行します。 –
@Integration遅れて申し訳ありませんが、Markが言ったことはまさに正しいです。あなたは** PARTITION **ステートメントであなたのパーティションを指定します。 –