当前位置: 首页 > 知识库问答 >
问题:

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

况唯
2023-03-14

我用的是Spark 2.2.1。

我有一个小数据帧(不到1M ),我在一个大数据帧上有一个计算,需要这个小数据帧来计算UDF中的一列。

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

广播这个DF更好吗(我不知道Spark是否会将笛卡尔放入内存)。

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

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

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

共有1个答案

戚俊美
2023-03-14

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

    < li >如果您可以做得比默认执行计划更好,并且不想创建自己的执行计划,则< code>udf可能是更好的方法。 < li >如果它只是一个笛卡尔坐标,并且需要后续的< code>explode -尽管如此,还是使用前一个选项。

正如T. Gawenda在第二种情况下的评论中所建议的,您可以使用广播

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

如果重用< code>udf,可能会提高一些性能。

 类似资料:
  • 我有一个大表<code>JavaPairRDD

  • 我正在编写解析和分析PDF的代码,目前正在处理文档中的加密。我无法从规范中理解如何在两种可能的加密方法之间做出选择。PDF规范中的一些详细信息...加密字典的字段支持以下值: 1=7.6.2“通用加密算法”中的“算法1:使用RC4或AES算法加密数据”,加密密钥长度为40位;见下文。 2=(PDF 1.4)7.6.2“通用加密算法”中的“算法1:使用RC4或AES算法加密数据”,但允许加密密钥长度

  • 输入: null 目标是使以下语句可编译: 这里有什么用?它想让我<编码>匹配器<?super java.util.list >并告诉我通过了 。那么如何在这里传递匹配器集合呢? 有一个关于将集合与hamcrest进行比较的问题,但没有传递Matchers集合的示例,而不是元素。

  • 我想使用广播接收器在固定时间调用此方法的警报 } 删除所有消息,但没有发生,请提前帮我谢谢 /***删除所有消息。0-成功删除。1-没有要*删除的内容。*/ 我正在使用这个广播接收器 正如你所说我做了我创建了一个活动 公共类Active扩展PendingMessages实现Runnable{ } 然后打电话过去 context.start服务(新意图(上下文,Activity.class)); 但

  • 问题内容: 我在这里找到执行跟踪任务的最惯用的方法。 任务 : 将数据从通道写入文件。 问题 : 我有一个频道 我需要从通道读取并将从通道读取的值写入文件。我的问题基本上是鉴于 如果通道已满,请立即写入值 如果通道未满,则每5s写一次。 因此,从本质上讲,至少需要每5s将数据写入文件一次(假设至少每5s将数据填充到通道中一次) 请告诉我用最好的方式,并做到我上面的任务吗? 谢谢! 问题答案: 没有

  • 一、简介 在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与广播变量 (broadcast variable): 累加器:用来对信息进行聚合,主要用于累计计数等场景; 广播变量:主要用于在节点间高效分发大对象。 二、累加器 这里先看一个具体的场景,对于正常的累计求和,如果在集群模式中使用下面的代码进行计算,会发现执行结果并非预期: var counter = 0