2016-06-27 15 views
2

に行(UNPIVOT)に列を変換する:は、私がこのような構造を持つテーブルがあるhiveql

column1, column2, column3, X1, X2, X3, X4 
A1,  A2,  A3,  5, 6, 1, 4 

私はすでにこれを行うことができた

column1, column2, column3, Key, Value 
A1,  A2,  A3,  X1, 5 
A1,  A2,  A3,  X2, 6 
A1,  A2,  A3,  X3, 1 
A1,  A2,  A3,  X4 4 

にこれを変換したいです"UNION ALL"と一緒にステッチされた4つのクエリを使用していますが、テーブルが巨大で、各選択が長いマップリダクションに変換されるため、UNIONを使用すると理想的にはN回かかることになります。 Nはピボットする列の数です。

私はexplode()定義済みのUDTFを調べようとしましたが、私はこの例では使用できません。私は次のようなものを試しましたが、構文を働かせることはできません。

select column1, column2, column3, explode(Map('X1':X1, 'X2':X2, ..)) 

誰かがこの作業を行う方法を正確に指摘できますか?私は私自身のUDTFを巻くことができると推測していますが、これがかなり標準的なものであることを望んでいますか?

EDIT: あり類似した何かを頼まれたのstackoverflowにanother questionですが、製剤が複雑で、私の意見で間違った答えが、現在正解としてマークされています。私はこの質問がもっとサクシンントであり、その要点だと思う。

+0

[ハイブ - ハイブのアンピボット機能]の可能な重複(http://stackoverflow.com/questions/32621970/hive-unpivot-functionality-in-hive) – gobrewers14

答えて

1

おっと、急いでこれを投稿したようです。私には答えがある。これを役に立つと思うかもしれない人たちのためにここに投稿してください。 これを実現するためにmapとexplodeを処理する正しい構文は次のとおりです。

select column1, column2, column3, m_key, m_val from 
    (select column1, column2, column3, map("X1", X1, "X2", X2, "X3", X3, "X4", X4) as map1 
    from table1) as t1 
lateral view explode(map1) xyz as m_key, m_val  
+0

これは尋ねたと何度も回答されています。 – gobrewers14

関連する問題