2016-08-11 3 views
2

で、私は以下のような豚の関係を持っている:{input_md5::type: chararray,input_md5::name: chararray,input_md5::id: long,input_md5::age: chararray,test_1:: type: chararray,test_2::name:chararray} =PIG:どのように削除する「::」のカラム名

FINAL

私はハイブテーブルにinput_md5関係のためにすべての列を保存しようとしています。 input_md5::type: chararray,input_md5::name: chararray,input_md5::id: long,input_md5::age: chararraytest_1:: type: chararray,test_2::name:chararray

を取っていないすべてのような は、以下のように.somethingをinput_md5の列のみをフィルタリング豚のいずれかのコマンドがあります:

STORE= FOREACH FINAL GENERATE all input_md5::type . 私はその豚を知っています:

FOREACH FINAL GENERATE all input_md5::type as type構文は、しかし、私は持っています私のコードではasを使用することができないので、多くの列。

私がしようとするので: STORE= FOREACH FINAL GENERATE input_md5::type .. bus_input_md5::name;

豚はエラーをスロー:以下、事前に

org.apache.hive.hcatalog.common.HCatException : 2007 : Invalid column position in partition schema : Expected column <type> at position 1, found column <input_md5::type>

おかげで、この問題を解決

答えて

5

は、修正です:

次のようなフィルタ条件でリレーションを作成します。

DUMMY_RELATION= FILTER SOURCE_TABLE BY type== '';(私はこれはそれが重要なすべては、我々はそのスキーマが必要である、テーブル内の任意の列でフィルタリングすることができ、タイプという名前の列を取った)

FINAL_DATASET= UNION DUMMY_RELATION,SCHEMA_1,SCHEMA_2;

(この新しいDUMMY_RELATION nが置かれるべきです これ以上持っていない::演算子あなたのソーステーブル(DUMMY_RELATIONへの)とターゲットテーブルが同じ列順序を持っていれば、あなたのカラム名はハイブテーブルのカラム名と一致します。

自分自身に感謝:)

+0

あなたのしたことを理解するのに苦労しています、これはそうですか? **問題**:テーブルがあり、対応する出力がありますが、colunmの名前が間違っている(不要なプレフィックスがあるため)ことはできません。 ** Solution/Trick **:宛先テーブルの行をゼロにし、その下の出力データを結合して、正しい列名を付けます。 (**警告/なぜ私はそれをトリックと呼ぶのですか**:この解決策はプレフィックスを取り除くだけでなく、列名を設定するので、列が正しい順序でないと驚くべき結果が得られます) –

+0

@Dennis Jaheruddin、これはsourceとtarget.answerで列の順序が一致する場合にのみうまくいくでしょう。 – Neethu

2

私はこのようにNeethuの例を実装しました。タイプミスがあるかもしれませんが、このアイデアを実装する方法を示しています。

tableA = LOAD 'default.tableA' USING org.apache.hive.hcatalog.pig.HCatLoader(); 
tableB = LOAD 'default.tableB' USING org.apache.hive.hcatalog.pig.HCatLoader(); 

--load empty table 
finalTable = LOAD 'default.finalTable' USING org.apache.hive.hcatalog.pig.HCatLoader(); 

--example operations that end up with '::' in column names 
g = group tableB by (id); 
j = JOIN tableA by id LEFT, g by group; 
result = foreach j generate tableA::id, tableA::col2, g::tableB; 

--union empty finalTable and result 
result2 = union finalTable, result; 

--bob's your uncle 
STORE result2 INTO 'finalTable' USING org.apache.hive.hcatalog.pig.HCatStorer(); 

Neethu!

関連する問題