问题描述
我有一列定义为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]
解决方法
我按照@jxc的建议使用map_from_entries
解决了这个问题,然后使用UDF
将1个项目的地图转换为2个项目的地图,并使用业务逻辑在2个单元之间进行转换
要注意的一件事是,从map_from_entries
返回的地图是scala地图。并且如果您使用java
,则需要确保udf方法改为使用scala
映射。
ps。也许我不必使用map_from_entries,相反,我可以使UDF
占据array
中的structType