将一个 Spark 数组列在 Spark SQL 中展开为多个列

huangapple go评论79阅读模式
英文:

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

huangapple
  • 本文由 发表于 2020年9月13日 21:10:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/63871169.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定