将spark数组列分解为多列sparksql

问题描述

我有一列定义为Value的列,如下所示

val Value: ArrayType = ArrayType(
  new StructType()
  .add("unit",StringType)
  .add("value",StringType)
)

和类似的数据

[[unit1,25],[unit2,77]]
[[unit2,100],[unit1,40]]
[[unit2,88]]
[[unit1,33]]

我知道spark sql可以使用functions.explode来使数据变成多行,但是我想要爆炸到多列(或1列但2列仅包含1列)。

所以最终结果如下所示

unit1 unit2
25  77
40  100
value1 88
33 value2

我该如何实现?

最初发布并更新后的

添加 我想得到这样的结果(这更像是我的最终目标)。

transformed-column
[[unit1,104],40]]
[[unit1,value1],33],value2]]

其中value1是使用[unit2,88]应用某种映射/转换功能的结果 同样,value2是使用[unit1,33]

应用相同的map / conversion函数的结果

解决方法

我按照@jxc的建议使用map_from_entries解决了这个问题,然后使用UDF将1个项目的地图转换为2个项目的地图,并使用业务逻辑在2个单元之间进行转换

要注意的一件事是,从map_from_entries返回的地图是scala地图。并且如果您使用java,则需要确保udf方法改为使用scala映射。

ps。也许我不必使用map_from_entries,相反,我可以使UDF占据array中的structType