Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用查找其他数据帧中的值来触发数据帧列转换_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Apache spark 使用查找其他数据帧中的值来触发数据帧列转换

Apache 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 以上哪个选

我需要通过查找其他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”。多谢各位