Обновление столбца карты в dataframe spark / scala - PullRequest
0 голосов
/ 18 мая 2018

У меня есть дата-карта с фреймом данных со столбцом типа карты. Я хочу добавить больше записей на эту карту

Я делаю следующее, что работает:

val origMap = df("mapping")

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

origMap.withColumn("mapping", tempMap.union(origMap))

tempDFFields - список имен столбцов в tempDF.

Я создаю карту всех colname-> colvalue из tempDF и хочу добавить ее в исходный DF. Он жалуется, что я передаю массив Column вместо одного экземпляра Column. Как я могу передать один экземпляр столбца здесь .. Я просто хочу обновить карту и сохранить ее обратно.

Пример:

Input

origDF

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

tempDF

+-----
|Id |
|1  |

вывод: origDF

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

1 Ответ

0 голосов
/ 18 мая 2018

Вы можете создать 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)|
+---+------+----------------------------+

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...