Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何从MapType列高效地创建多个列(无foldleft)_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

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|
+---+----+----+