我需要在火花中连接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
关于此设置,我有以下问题:
我继续做了一些小实验来回答你的第一个问题。
问题一:
a
b
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行较小的df
a
。
运行: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]
现在,如果您看到,dataframe
b
是广播的,即使它有10行。在问题1中,没有提示,a
是广播的。
注意:广播提示在SQL火花可用于2.2
了解物理计划的提示:
从LocalTableScan[列列表]
中找出数据帧
BroadcastExchange
的子树/列表下的数据帧正在广播。对选项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不支持消息传递;如何确保消息被成功发送和接收到预定的人?
在这个示例中,我有两个表,包含我的客户和一家办公用品商店的产品的数据。如下所示: 上面的表主要功能是为第三个表,即订单表,提供所需的数据 使用订单表,我可以从客户和产品表中获得我需要的报告的快速摘要。当我想查看每个客户每件商品的购买数量时,问题就开始了。 比如这些表格。 使用上面的表格,我需要创建一个报告,显示每个项目的每个客户的购买数量。 像这样。 我已经使用通过来显示项目,但是我现在的代码太长