使用Scala从sortedMap替换Spark Dataset列值的有效方法是什么?

时间:2018-04-07 02:30:28

标签: apache-spark apache-spark-sql apache-spark-dataset

我有一个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"))

但代码无效。

1 个答案:

答案 0 :(得分:0)

不需要为此创建udf功能。简单的left joinselect函数应该可以解决问题

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)