spark使用查找值到其他Dataframe中的Dataframe列转换

时间:2018-02-23 16:57:05

标签: apache-spark apache-spark-sql spark-dataframe

我需要通过查找其他数据帧来转换数据帧的多个列值。

enter image description here

右边的其他数据框不会有太多行,比如大约5000条记录。

我需要将field_1列值替换为field_1,0到8&的比率。通过查找正确的数据帧,field_1,3到25。

所以最终它将被填充如下:

enter image description here

选项1 是加载&将左侧的查找数据帧收集到内存中,并将其作为boadcast变量广播。我相信可以使用Map Map,并且不应该对执行程序占用太多内存。

选项2 加入每列的查找数据框。但我相信这将是非常低效的,因为字段列的数量可能太多,如50到100.

以上哪个选项好?或者有更好的方法来填补价值观吗?

1 个答案:

答案 0 :(得分:2)

我会选择option1,例如:

val dfBig : DataFrame = ??? 
val dfLookup : DataFrame = ???

val lookupMap = dfLookup
  .map{case Row(category:String,field_values:Int,ratio:Int) => ((category,field_values),ratio)}
  .collect()
  .toMap

val bc_lookupMap = spark.sparkContext.broadcast(lookupMap)

val lookupUdf = udf((field1:Int,field2:Int) =>
  (bc_lookupMap.value(("field_1",field1)),bc_lookupMap.value(("field_2",field2)))
)

dfBig
  .withColumn("udfResult", lookupUdf($"field_1",$"field_2"))
  .select($"primaryId",$"udfResult._1".as("field_1"),$"udfResult._2".as("field_2"))