Apache spark 使用查找其他数据帧中的值来触发数据帧列转换
我需要通过查找其他dataframe来转换dataframe的多列值 右边的另一个数据帧不会有太多行,比如说大约5000条记录 例如,我需要通过查找右数据帧来替换字段_1列值与字段_1,0到8和字段_1,3到25的比率 因此,最终将按如下方式填充: 选项1是将左侧的查找数据帧加载并收集到内存中,作为boadcast变量进行广播。我相信地图地图是可以使用的,不应该占用执行者太多的内存 选项2是连接每列的查找数据框。但我相信这将是非常低效的,因为字段列的数量可能太多,比如50到100Apache spark 使用查找其他数据帧中的值来触发数据帧列转换,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我需要通过查找其他dataframe来转换dataframe的多列值 右边的另一个数据帧不会有太多行,比如说大约5000条记录 例如,我需要通过查找右数据帧来替换字段_1列值与字段_1,0到8和字段_1,3到25的比率 因此,最终将按如下方式填充: 选项1是将左侧的查找数据帧加载并收集到内存中,作为boadcast变量进行广播。我相信地图地图是可以使用的,不应该占用执行者太多的内存 选项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"))
我建议您使用选项一,即广播查找数据帧的映射。您应该尝试这两种方法并对它们进行基准测试,因为代码似乎不太重要,但我也怀疑选项1会快得多。一张5000行的地图很小。谢谢你的回复。我是新的火花环境。我还发现我们可以广播一个小数据帧,然后进行广播连接。需要看看这会是什么样子。例如:我想可能会有太多的连接,但因为每个操作都在单独的列上(窄转换),Catalyst会优化它,使其像在数据帧上的显式映射操作一样在单过程中执行。我只是好奇这些方法中哪一个会更有效?查找udf或广播联接。我知道广播连接是一个内部spark实现,但是如果查找udf只涉及键值“map.get”,我不认为它的性能会不如它的连接对应物。有什么意见吗?@RaphaelRoth-在同一个例子上,如果我需要这样做,你会有什么建议?例如,我的单元格值包含“我找到了0和2”应替换为“我找到了9和5”。多谢各位