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

Apache Spark:广播连接行为:过滤连接表和临时表

沃学
2023-03-14

我需要在火花中连接2个表。但是我首先过滤掉第二个表的一部分,而不是完全连接2个表:

spark.sql("select * from a join b on a.key=b.key where b.value='xxx' ")

我想在这种情况下使用广播连接。

Spark有一个参数,用于定义广播连接的最大表大小:spark.sql.autoBroadcastJoinThreshold

配置在执行联接时将广播到所有工作节点的表的最大大小(以字节为单位)。通过将该值设置为-1,可以禁用广播。请注意,当前统计信息仅支持已运行命令ANALYZE TABLE COMPUTE statistics noscan的配置单元元存储表。http://spark.apache.org/docs/2.4.0/sql-performance-tuning.html

关于此设置,我有以下问题:

  1. spark会将哪个表格大小与autoBroadcastJoinThreshold的值进行比较:完整大小,还是应用where子句后的大小

共有2个答案

温星华
2023-03-14

我继续做了一些小实验来回答你的第一个问题。

问题一:

  • 创建了一个包含3行[key,df_a_column]的数据帧a
  • 创建了一个包含10行[键,值]的数据帧b
  • ran:spark.sql("SELECT*from a JOIN b ONa.key=b.key")
== Physical Plan ==
*(1) BroadcastHashJoin [key#122], [key#111], Inner, BuildLeft, false
:- BroadcastExchange HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#168]
:  +- LocalTableScan [key#122, df_a_column#123]
+- *(1) LocalTableScan [key#111, value#112]

正如所料,广播的是3行较小的dfa

  • 运行:spark.sql("SELECT*from a JOIN b ONa.key=b.key其中b.value=\"bat\")。
== Physical Plan ==
*(1) BroadcastHashJoin [key#122], [key#111], Inner, BuildRight, false
:- *(1) LocalTableScan [key#122, df_a_column#123]
+- BroadcastExchange HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#152]
   +- LocalTableScan [key#111, value#112]

在这里,您可以注意到数据帧b正在广播!Means spark在应用where选择要播放的内容后,会评估大小。

问题2:

是的,你是对的。从以前的输出中可以明显看出,它首先适用于哪里。

问题3:不,你不能分析,但是你可以通过暗示火花来广播临时视图表,即使在SQL。参考

如果你现在看到解释:

== Physical Plan ==
*(1) BroadcastHashJoin [key#122], [key#111], Inner, BuildRight, false
:- *(1) LocalTableScan [key#122, df_a_column#123]
+- BroadcastExchange HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#184]
   +- LocalTableScan [key#111, value#112]

现在,如果您看到,dataframeb是广播的,即使它有10行。在问题1中,没有提示,a是广播的。

注意:广播提示在SQL火花可用于2.2

了解物理计划的提示:

  • 从LocalTableScan[列列表]
  • 中找出数据帧
  • BroadcastExchange的子树/列表下的数据帧正在广播。
鲜于凯康
2023-03-14

对选项2的理解是正确的。不能在spark中分析临时表。读这里

如果您想带头指定要广播的数据帧,可以使用下面的代码段-

df = df1.join(F.broadcast(df2),df1.some_col == df2.some_col, "left")
 类似资料:
  • 问题内容: 我一直在使用多个Raspberry Pi,Python和一些按钮/开关进行游戏。我的游戏需要一个中央服务器,该服务器向多个客户端发出命令。 我不是编程新手,而是Python和较低级网络通信的新手,在过去两天里,我一直迷失在如何精确编写服务器代码方面。 客户端程序是一个简单的socket.connect,然后等待发送数据。那里没有问题。 我很难确定确切的编写方式以及如何使服务器正常工作。

  • 问题内容: 我在两个表之间有多对多关系。 表包含我的餐厅。 表包含不同的类别。 表包含两列,每列分别包含两个表的ID。 以下陈述是我能想到的,但没有给我我想要的输出。 我希望输出是有关餐厅的信息,并在最后一列中是类别的连接行。 问题答案: 要串联值,可以使用。xml路径解决方案有误,应使用和特殊字符。 您也可以使用变量解决方案

  • 如何在使用某些条件筛选每个表之后连接两个表,并在获得筛选结果后连接两个结果。 已尝试代码,但显示语法错误

  • 声明(AndroidMANIFEST.xml)一个广播接收器: 让我困惑的是通过adb shell调用意图的结果: A)匹配动作

  • 我是套接字IO开发的新手。我想知道以下情况: > 支持的并发打开套接字数的最大限制? 为生产而微调节点服务器时需要注意的指导原则/额外的注意事项。 socket.io确保消息传递吗?还是送了就忘了?另外,在安装时是否有节点模块可以利用此特性? 如果socket.io不支持消息传递;如何确保消息被成功发送和接收到预定的人?

  • 在这个示例中,我有两个表,包含我的客户和一家办公用品商店的产品的数据。如下所示: 上面的表主要功能是为第三个表,即订单表,提供所需的数据 使用订单表,我可以从客户和产品表中获得我需要的报告的快速摘要。当我想查看每个客户每件商品的购买数量时,问题就开始了。 比如这些表格。 使用上面的表格,我需要创建一个报告,显示每个项目的每个客户的购买数量。 像这样。 我已经使用通过来显示项目,但是我现在的代码太长