gpt4 book ai didi

apache-spark - 如何使用 Spark 在加入(广播)和收集之间进行选择

转载 作者:行者123 更新时间:2023-12-04 17:45:58 25 4
gpt4 key购买 nike

我正在使用 Spark 2.2.1。

我有一个小 DataFrame(小于 1M),我在一个大 DataFrame 上进行计算,需要这个小 DataFrame 来计算 UDF 中的列。

关于性能的最佳选择是什么

广播这个DF好不好(不知道Spark会不会做笛卡尔进内存)。

bigDF.crossJoin(broadcast(smallDF))
.withColumn(udf("$colFromSmall", $"colFromBig"))

或者收集它并直接在 udf 中使用 small

val small = smallDF.collect()
bigDF.withColumn(udf($"colFromBig"))

最佳答案

两者都会先收集数据,所以在内存占用方面没有区别。所以选择应该由逻辑决定:

  • 如果您可以比默认执行计划做得更好并且不想创建自己的执行计划,udf 可能是更好的方法。
  • 如果它只是一个笛卡尔坐标,并且需要后续的 explode - 放弃这个想法 - 只需使用前一个选项即可。

按照建议in the comments通过 T.Gawęda在第二种情况下,您可以使用广播

val small = spark.spark.broadcast(smallDF.collect())
bigDF.withColumn(udf($"colFromBig"))

如果 udf 被重用,它可能会提供一些性能改进。

关于apache-spark - 如何使用 Spark 在加入(广播)和收集之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48583582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com