2012-04-20 10 views
0

ログファイルのセットがあり、Hiveテーブルが作成されました。今は私が理解できないcolをベースにテーブルを分割したいと考えています&例は見当たりませんパーティションの列を指定する方法col/fieldを指定する方法 Ex。 49:10629〜[HTTP-7001から11]〜DE1F6F6667913022AE2620D1228817D6〜END〜/管理/ BP /セットアップ/ newedit/OK〜PT〜219〜Apache Hiveどの列がパーティションであるかを特定する方法

ここでログ

2012-04-11 16からのラインがあります

table strucは です。CREATE TABLEログ(開始時刻STRING、スレッドSTRING、セッションSTRING、メソッドSTRING、ターゲットSTRING STRING、レジストリ文字列、IPアドレスSTRING、詳細STRING)は、 '〜'によって終了された行フォーマット整形済みフィールドです。 6列、すなわち'レジストリ'をログのパーティションにしたい場合は、どのようにしてパーティションステートメントを作成しますか? 一般に、行c1、c2、.....を持つ行(行)を持っている場合パーティションでcol ciを指定する方法は? ありがとう

答えて

0

最初に行う必要があることは、テーブルを作成するときにどの列がパーティションであると予想されるかを明示的に伝えることです。 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 
            `------- ... 

私は何をするだろうことは次のとおりです。

  1. の作成します外部表(まだ)ありませんパーティションに、すべてのデータをテーブル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' 
    
  2. 使用ハイブのダイナミックパーティションは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

の詳細を読むことができます
+0

私はあなたのソリューションが好きです、そうするでしょう、私はあなたのソリューションを理解して、ありがとう!しかし、理解のために、私がraw_logを作成しなければ、col1、c2、c3 ... c10を持つデータ行がある場合、どのようにしてhiveに伝えますか?〜)どのようにcol c3またはc5をパーティションcolとして指定するのですか? – Integration

+0

これは動的パーティションのクエリで行います。 'INSERT OVERWRITE TABLE log PARTITION(registry)'では、パーティション化されたログテーブルで、レジストリをパーティションカラムとして機能させることを指定しています。 パーティションレベルが複数ある場合は、代わりにPARTITION(c3、c5)を実行します。 –

+0

@Integration遅れて申し訳ありませんが、Markが言ったことはまさに正しいです。あなたは** PARTITION **ステートメントであなたのパーティションを指定します。 –

0

さらに、ハイブはパーティション化された外部テーブルに問題があります。たとえば、dt = 21012-04-01やその他の同様のディレクトリのように、フォームのサブディレクトリにデータを設定した後、テーブルを外部に宣言してテーブルを作成するとします。あなたのデータが選択項目に表示されないこと以外は、すべて表示されます。

弾性マップは、それが私のデータがなかった理由を見つけるために私にしばらく時間がかかったので、私はこの情報を追加していこの問題に

ALTER TABLE log RECOVER PARTITIONS; 

を解く機能を追加削減します。

関連する問題