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

时间:2016-06-27 22:49:06

标签: sql hadoop hive 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

我已经能够使用与" UNION ALL"拼接在一起的4个查询,但由于表格很大并且每个选择转换为冗长的map-reduce,因此使用UNION会使查询占用N理想的时间。其中N是要转动的列数。

我尝试了探索爆炸()预定义的UDTF,但我无法在此示例中使用它。我试过类似下面的内容,但是我无法使语法有效。

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

有人可以指出具体如何使这项工作?我猜我可以推出自己的UDTF,但我希望这是非常标准的东西吗?

修改 stackoverflow上有another question,其中有类似的问题,但是这个表达方式很复杂,在我看来,错误的答案目前被标记为正确的答案。我认为这个问题更具有苛刻性和重要性。

1 个答案:

答案 0 :(得分:1)

哎呀,似乎匆匆发布了这个。我有答案。在这里发布给其他可能觉得有用的人。 这是处理map和爆炸以实现此目的的正确语法。

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