在 hiveql 中将列转换为行 (UNPIVOT)
Converting columns to rows (UNPIVOT) in hiveql
我有一个 table 结构如下:
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 个查询来做到这一点,但是由于 table 很大并且每个 select 转化为一个冗长的 map-reduce,使用UNION 使查询花费的时间是理想时间的 N 倍。其中 N 是要转换的列数。
我尝试探索 explode() 预定义的 UDTF,但我无法在此示例中使用它。我尝试了类似下面的操作,但无法使语法正常工作。
select column1, column2, column3, explode(Map('X1':X1, 'X2':X2, ..))
有人可以具体指出如何进行这项工作吗??我猜我可以推出自己的 UDTF,但我希望这是非常标准的东西吗?
编辑:
在 Whosebug 上有 another question,其中提出了类似的问题,但公式很复杂,在我看来错误的答案目前被标记为正确答案。我觉得这个问题比较简明扼要
哎呀,看来发的太仓促了。我有答案。将它张贴在这里供其他可能觉得有用的人使用。
这是处理 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
我有一个 table 结构如下:
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 个查询来做到这一点,但是由于 table 很大并且每个 select 转化为一个冗长的 map-reduce,使用UNION 使查询花费的时间是理想时间的 N 倍。其中 N 是要转换的列数。
我尝试探索 explode() 预定义的 UDTF,但我无法在此示例中使用它。我尝试了类似下面的操作,但无法使语法正常工作。
select column1, column2, column3, explode(Map('X1':X1, 'X2':X2, ..))
有人可以具体指出如何进行这项工作吗??我猜我可以推出自己的 UDTF,但我希望这是非常标准的东西吗?
编辑: 在 Whosebug 上有 another question,其中提出了类似的问题,但公式很复杂,在我看来错误的答案目前被标记为正确答案。我觉得这个问题比较简明扼要
哎呀,看来发的太仓促了。我有答案。将它张贴在这里供其他可能觉得有用的人使用。 这是处理 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