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"))
我需要通过查找其他数据框来转换数据框的多列值。
右边的另一个数据框不会有太多行,比如大约 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"))