更新dataframe spark/scala中的映射列
我有一个dataframe origMap,其中一列是map类型的。我想向该地图添加更多条目 我正在做以下工作,这很有效:更新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
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怎么办。