在hiveql中将列转换为行(UNPIVOT)



我有一个表的结构像这样:

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

我已经能够使用4个查询与"UNION ALL"拼接在一起,但是由于表很大,每个选择都转换为冗长的map-reduce,使用UNION使查询花费的时间是理想情况下应该花费的时间的N倍。其中N为主列数

我尝试探索explosion()预定义的UDTF,但是我不能在这个例子中使用它。我尝试了下面的东西,但无法使语法工作。

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

谁能指出到底如何使这个工作??我猜我可以滚动我自己的UDTF,但我希望这是相当标准的东西?

编辑:

在stackoverflow上还有一个类似的问题,但公式很复杂,在我看来,错误的答案目前被标记为正确的答案。我认为这个问题更简洁,更切题。

哎呀,似乎发得太匆忙了。我有答案了。把它贴在这里,供其他可能觉得有用的人使用。下面是处理map和explosion的正确语法。

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    

最新更新