英文:
explode an spark array column to multiple columns 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
将数据拆分为多行,但我想要的是将其拆分为多列(或者对于只有一个项目的情况,拆分为一个包含两个项目的列)。
因此,最终结果如下所示:
unit1 unit2
25 77
40 100
value1 88
33 value2
我该如何实现这个目标?
附加说明 初始发布后更新:
我想要获取如下的结果(这更像是我的最终目标)。
transformed-column
[[unit1, 25], [unit2, 77]]
[[unit2, 104], [unit1, 40]]
[[unit1, value1], [unit2, 88]]
[[unit1, 33], [unit2, value2]]
其中 value1
是将 [unit2, 88]
应用某种映射/转换函数得到的结果。
类似地,value2
是将相同的映射/转换函数应用于 [unit1, 33]
得到的结果。
英文:
I have a column which has type Value
defined like below
val Value: ArrayType = ArrayType(
new StructType()
.add("unit", StringType)
.add("value", StringType)
)
and data like this
[[unit1, 25], [unit2, 77]]
[[unit2, 100], [unit1, 40]]
[[unit2, 88]]
[[unit1, 33]]
I know spark sql can use functions.explode to make the data become multiple rows, but what i want is explode to multiple columns (or the 1 one column but 2 items for the one has only 1 item).
so the end result looks like below
unit1 unit2
25 77
40 100
value1 88
33 value2
How could I achieve this?
addtion after initial post and update
I want to get result like this (this is more like my final goal).
transformed-column
[[unit1, 25], [unit2, 77]]
[[unit2, 104], [unit1, 40]]
[[unit1, value1], [unit2, 88]]
[[unit1, 33],[unit2,value2]]
where value1
is the result of applying some kind of map/conversion function using the [unit2, 88]
similarly, value2
is the result of applying the same map /conversion function using the [unit1, 33]
答案1
得分: 0
我使用了@jxc建议的map_from_entries
来解决了这个问题,然后使用UDF
将一个项目的映射转换为两个项目的映射,使用业务逻辑在这两个单位之间进行转换。
需要注意的一点是从map_from_entries
返回的是Scala映射。如果你使用java
,确保UDF方法接受scala
映射。
附注:也许我不必使用map_from_entries
,而是可以使UDF
接受structType
数组。
英文:
I solved this problem using the map_from_entries
as suggested by @jxc, and then used UDF
to convert the map of 1 item to map of 2 items, using business logic to convert between the 2 units.
one thing to note is the map returned from map_from_entries
is scala map. and if you use java
, need to make sure the udf method takes scala
map instead.
ps. maybe I did not have to use map_from_entries, instead maybe i could make the UDF
to take array
of structType
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论