Apache spark 如何使用Spark在加入(广播)和收集之间进行选择
我用的是Spark 2.2.1 我有一个小数据帧(小于1M),我有一个大数据帧上的计算,需要这个小数据帧来计算UDF中的一列 关于性能的最佳选择是什么 广播这个DF是否更好(我不知道Spark是否会将笛卡尔坐标转换到内存中) 或者收集它并直接在udf中使用Apache spark 如何使用Spark在加入(广播)和收集之间进行选择,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我用的是Spark 2.2.1 我有一个小数据帧(小于1M),我有一个大数据帧上的计算,需要这个小数据帧来计算UDF中的一列 关于性能的最佳选择是什么 广播这个DF是否更好(我不知道Spark是否会将笛卡尔坐标转换到内存中) 或者收集它并直接在udf中使用small值 val small = smallDF.collect() bigDF.withColumn(udf($"colFromBig")) 两者都将首先收集数据,因此在内存占用方面没有区别。因此,选择应该由逻辑决定: 如果您可以比默
small
值
val small = smallDF.collect()
bigDF.withColumn(udf($"colFromBig"))
两者都将首先收集数据,因此在内存占用方面没有区别。因此,选择应该由逻辑决定:
- 如果您可以比默认执行计划做得更好,并且不想创建自己的执行计划,
可能是一种更好的方法udf
- 如果它只是一个笛卡尔坐标系,并且需要后续的
-尽管如此,还是销毁它-只需使用前一个选项即可分解
val small = spark.spark.broadcast(smallDF.collect())
bigDF.withColumn(udf($"colFromBig"))
如果重用
udf
,它可能会提供一些性能改进。交叉连接将为第一个DF中的每一行创建一个或多个smallDF行。内存占用将更高,在切换到第二种方法之前,我得到了很多OOM。当然,只有在UDFBtw中有必要时,手动广播才更好。请建议手动广播,而不是直接引用:)@T.Gawęda我将重点关注明确的论点,我不确定广播在这里是否有益,但已完成:)
val small = spark.spark.broadcast(smallDF.collect())
bigDF.withColumn(udf($"colFromBig"))