我在输入中有一个数据框,其中包含id列和Map列。
地图:
key1 -> value1, key2 -> value2 ... key100 -> value100,
key1 -> value3, key2 -> value4 ... key100 -> value200
我想要输出以下结果:
id key1 key2 ... key100
1 value1 value2 value100
2 value3 value4 value200
感谢您的退货,祝您有美好的一天。
这是一个基于Spark内置函数的解决方案:
import org.apache.spark.sql.functions.{monotonically_increasing_id, explode, first}
val df = Seq(
(Map("key1" -> "value1", "key2" -> "value2", "key3" -> "value3", "key4" -> "value4")),
(Map("key1" -> "value1", "key2" -> "value2")),
(Map("key1" -> "value1", "key3" -> "value3")))
.toDF("map_data")
df.withColumn("id", monotonically_increasing_id)
.select($"id", explode($"map_data"))
.groupBy("id")
.pivot("key")
.agg(first("value"))
.show(false)
// +---+------+------+------+------+
// |id |key1 |key2 |key3 |key4 |
// +---+------+------+------+------+
// |0 |value1|value2|value3|value4|
// |1 |value1|value2|null |null |
// |2 |value1|null |value3|null |
// +---+------+------+------+------+
withColumn("id", monotonically_increasing_id)
:为每行添加唯一的ID。explode($"map_data")
:map_data
将其爆炸将创建另外两个列,key
和value
。groupBy...pivot
:按ID分组并按键旋转本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句