我需要通过查找其他数据帧来转换数据帧的多个列值。
右边的其他数据框不会有太多行,比如大约5000条记录。
我需要将field_1列值替换为field_1,0到8&的比率。通过查找正确的数据帧,field_1,3到25。
所以最终它将被填充如下:
选项1 是加载&将左侧的查找数据帧收集到内存中,并将其作为boadcast变量广播。我相信可以使用Map Map,并且不应该对执行程序占用太多内存。
选项2 加入每列的查找数据框。但我相信这将是非常低效的,因为字段列的数量可能太多,如50到100.
以上哪个选项好?或者有更好的方法来填补价值观吗?
答案 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"))