Scala 如何从MapType列高效地创建多个列(无foldleft)
我的目标是从另一个Scala 如何从MapType列高效地创建多个列(无foldleft),scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我的目标是从另一个MapType列创建列。作为映射键的列的名称及其关联值 在我的起始数据帧下面: +-----------+---------------------------+ |id | mapColumn | +-----------+---------------------------+ | 1 |Map(keyA -> 0, keyB -> 1) | | 2 |Map(keyA ->
MapType
列创建列。作为映射键的列的名称及其关联值
在我的起始数据帧下面:
+-----------+---------------------------+
|id | mapColumn |
+-----------+---------------------------+
| 1 |Map(keyA -> 0, keyB -> 1) |
| 2 |Map(keyA -> 4, keyB -> 2) |
+-----------+---------------------------+
低于所需输出:
+-----------+----+----+
|id |keyA|keyB|
+-----------+----+----+
| 1 | 0| 1|
| 2 | 4| 2|
+-----------+----+----+
我找到了一个带有蓄能器的折叠式过滤器的解决方案(工作但非常缓慢):
真正的起始数据帧是巨大的,我需要优化。您可以简单地使用
explode
函数分解映射类型列,然后使用pivot
将每个键作为新列获取。大概是这样的:
val df = Seq((1,Map("keyA" -> 0, "keyB" -> 1)), (2,Map("keyA" -> 4, "keyB" -> 2))
).toDF("id", "mapColumn")
df.select($"id", explode($"mapColumn"))
.groupBy($"id")
.pivot($"key")
.agg(first($"value"))
.show()
给出:
+---+----+----+
| id|keyA|keyB|
+---+----+----+
| 1| 0| 1|
| 2| 4| 2|
+---+----+----+
很好,我忘了默认情况下explode将创建键/值
+---+----+----+
| id|keyA|keyB|
+---+----+----+
| 1| 0| 1|
| 2| 4| 2|
+---+----+----+