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

NG *_*lgo 4 sql hadoop hive unpivot hiveql

我有一个结构如下的表:

column1, column2, column3, X1, X2, X3, X4
A1,      A2,      A3,      5,  6,  1,  4
Run Code Online (Sandbox Code Playgroud)

我想把它转换成

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
Run Code Online (Sandbox Code Playgroud)

我已经能够使用与“UNION ALL”缝合在一起的 4 个查询来完成此操作,但由于表很大并且每个选择都会转换为冗长的映射缩减,因此使用 UNION 会使查询花费的时间是理想情况下的 N 倍。其中 N 是要旋转的列数。

我尝试探索explode()预定义的UDTF,但我无法在这个示例中使用它。我尝试了类似以下的内容,但无法使语法正常工作。

select column1, column2, column3, explode(Map('X1':X1, 'X2':X2, ..))
Run Code Online (Sandbox Code Playgroud)

有人可以准确指出如何进行这项工作吗?我猜我可以推出自己的 UDTF,但我希望这是相当标准的东西?

编辑: stackoverflow 上 还有另一个问题,其中提出了类似的问题,但表述很复杂,在我看来,错误的答案当前被标记为正确的答案。我认为这个问题更简洁、更切题。

NG *_*lgo 5

哎呀,看来发帖太匆忙了。我有答案了。将其发布在这里,供其他可能觉得有用的人使用。以下是处理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    
Run Code Online (Sandbox Code Playgroud)