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

spark Dataframe column transformations using lookup for values into other Dataframe

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

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

我需要通过查看正确的数据框将 field_1 列值替换为 field_1、0 到 8 和 field_1、3 到 25 等比率。

所以最终它会像下面这样被填充:

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

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

以上哪个选项好?或者有没有更好的填充值的方法?

我会选择选项 1,例如:

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"))