更新dataframe spark/scala中的映射列

更新dataframe spark/scala中的映射列,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个dataframe origMap,其中一列是map类型的。我想向该地图添加更多条目 我正在做以下工作,这很有效: val origMap = df("mapping") val tempMap = tempDFFields.flatMap(tempField => Array(lit(tempField), tempDF(tempField))): _*) origMap.withColumn("mapping", tempMap.union(origMap)) Tempd

我有一个dataframe origMap,其中一列是map类型的。我想向该地图添加更多条目

我正在做以下工作,这很有效:

val origMap = df("mapping")

val tempMap = tempDFFields.flatMap(tempField => Array(lit(tempField), tempDF(tempField))): _*)

origMap.withColumn("mapping", tempMap.union(origMap))
TempdFields是tempDF中的列名列表

我正在从tempDF创建所有colname->colvalue的映射,并希望将其添加到原始DF。 它抱怨我传递的是列的数组,而不是列的单个实例。如何在此处传递列的单个实例。。我只想更新地图并将其存储回去

例如:

输入

origDF

+--------+-----------------------------
|id  | amount       | mapping         | 
|1   | 10           | {a=b, c=d}      |
|3   | 90           | {e=f, g=h}           |
坦普德夫

+-----
|Id |
|1  |
输出:origDF

+--------+-----------------------------
|id  | amount       | mapping          | 
|1   | 10           | {a=b, c=d, id=1} |
|3   | 90           | {e=f, g=h, id=1} |

您可以创建一个
udf
来合并地图,如下所示

val origDF = Seq(
  (1, 10, Map("a" -> "b", "c" -> "d")),
  (3, 90, Map("e" -> "f", "g" -> "h"))
).toDF("id", "amount", "mapping")

If you have a single row DF you can create a map directly
val tmpDF = Map("id" -> "1")

//UDf to merge the two map 
val addToMap = udf((mapping: Map[String, String]) => {mapping ++ tmpDF})

//Use the udf 
origDF.withColumn("mapping", addToMap($"mapping"))

.show(false)
输出:

+---+------+----------------------------+
|id |amount|mapping                     |
+---+------+----------------------------+
|1  |10    |Map(a -> b, c -> d, id -> 1)|
|3  |90    |Map(e -> f, g -> h, id -> 1)|
+---+------+----------------------------+

希望这有帮助

你能用一些输入和输出数据解释一下吗?@ShankarKoirala补充了Map类型的映射字段,什么是tempDF?是的,Map类型的映射操作系统。tempDF是另一个DF。是否始终有一列?如果
tempDF
Id
包含值1、2和3怎么办。