Каков эффективный способ заменить значение столбца Spark Dataset из sortedMap с помощью Scala?

Например, у меня SortedMap:

key   value
-----------
aaa     1
bbb     2
ccc     3

И набор данных с 3 столбцами:

col1   col2   col3
------------------
zzz     aaa     w
xxx     ccc     n
sss     bbb     v

Я хочу изменить значение столбца col2 с SortedMap, поэтому результирующий набор данных будет следующим:

col1   col2   col3
------------------
zzz      1      w
xxx      3      n
sss      2      v

Я создал UDF

val udf1 = udf((col: String) => sortedMap(col).toString())

И написал следующее, чтобы изменить значение столбца

dataset.withColumn("col2", udf1($"col2"))

Но код не работает.


person Abir Chokraborty    schedule 07.04.2018    source источник
comment
Не работает как? Неверный ответ или выдает ошибку? Если это последнее, было бы полезно, если бы вы опубликовали ошибку.   -  person pault    schedule 07.04.2018
comment
Программа зависла, прогресса нет.   -  person Abir Chokraborty    schedule 07.04.2018


Ответы (1)


Для этого не нужно создавать udf функцию. Простые left join и select функции должны помочь

import org.apache.spark.sql.functions._
dataSet.join(sortedMap, dataSet("col2") === sortedMap("key"), "left")
  .select(col("col1"), col("value").as("col2"), col("col3"))
  .show(false)

что должно дать вам

+----+----+----+
|col1|col2|col3|
+----+----+----+
|zzz |1   |w   |
|xxx |3   |n   |
|sss |2   |v   |
+----+----+----+

если ваш набор данных sortedMap небольшой, вы можете использовать широковещательную рассылку

val broadCasted = sc.broadcast(sortedMap)

import org.apache.spark.sql.functions._
dataSet.join(broadCasted.value, dataSet("col2") === broadCasted.value("key"), "left")
  .select(col("col1"), col("value").as("col2"), col("col3"))
  .show(false)
person Ramesh Maharjan    schedule 07.04.2018