Apache spark sparksql广播散列联接

Apache spark sparksql广播散列联接,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在尝试使用SparkSQL在数据帧上执行广播哈希连接,如下所述: 在该示例中,小数据帧通过saveAsTable持久化,然后通过sparksql进行连接,即通过sqlContext.SQL 我的问题是,我需要使用sparksqlapi来构造我的SQL,我只剩下用ID列表连接约50个表,不想手工编写SQL How do I tell spark to use the broadcast hash join via the API? The issue is that if I load th

我正在尝试使用SparkSQL在数据帧上执行广播哈希连接,如下所述:

在该示例中,小数据帧通过saveAsTable持久化,然后通过sparksql进行连接,即通过sqlContext.SQL

我的问题是,我需要使用sparksqlapi来构造我的SQL,我只剩下用ID列表连接约50个表,不想手工编写SQL

How do I tell spark to use the broadcast hash join via the API?  The issue is that if I load the ID list (from the table persisted via `saveAsTable`) into a `DataFrame` to use in the join, it isn't clear to me if Spark can apply the broadcast hash join.

您可以显式地将数据帧标记为足够小以进行广播 使用广播功能:

Python:

从pyspark.sql.functions导入广播 小_df=。。。 大_df=。。。 大的,小的[foo] 或广播提示火花>=2.2:

largeDF.join(smallDF.hint("broadcast"), Seq("foo"))
大尺寸接缝小尺寸hintbroadcast[foo] 斯卡拉:

导入org.apache.spark.sql.functions.broadcast val smallDF:DataFrame=??? val largeDF:数据帧=??? 大的,小的 或广播提示火花>=2.2:

largeDF.join(smallDF.hint("broadcast"), Seq("foo"))
SQL

您可以使用提示:

选择/*+MAPJOINsmall*/* 从大到小 ON large.foo=small.foo 或

选择/*+small*/* 从大到小 ON large.foo=small.foo 或

选择/*+broadcastmall*/* 从大到小 在较大的.foo=small.foo上 R斯巴克:

提示火花>=2.2时:

largeDF.join(smallDF.hint("broadcast"), Seq("foo"))
joinlarge、hintsmall、广播、大$foo==小$foo 广播火花>=2.3时

joinlarge,broadcastmall,large$foo==小$foo 注:


如果其中一个结构相对较小,则广播连接非常有用。否则,它可能比完全洗牌要昂贵得多

通过广播连接,连接等式的一侧正在具体化,并发送给所有映射者。因此,它被视为映射侧连接

随着数据集的具体化和通过网络发送,它只会带来显著的性能改进,如果它相当小的话

因此,如果您试图执行smallDF.joinlargeDF

等等。。!!!另一个限制是,它还需要完全适应每个执行器的内存。它还需要适应驱动程序的内存

广播变量使用Torrent协议(即对等协议)在执行者之间共享,Torrent协议的优点是,对等方彼此共享文件块,而不依赖于持有所有块的中心实体

上述示例足以开始使用广播连接

注: 创建后无法修改值。 如果尝试,更改将仅在一个节点上(&N)

shuffledHashJoin: 印度的所有数据将被混合到每个州的29个键中。 问题: 不均匀碎片。 具有29个输出分区的有限并行性

broadcaseHashJoin:

将小RDD广播到所有工作节点。 大型rdd的并行性仍然保持着,而洗牌并不均匀 必需的


PS:图像可能很难看,但信息丰富。

谢谢!通过一些实验,我发现smallDF.joinlargeDF不进行广播哈希连接,但largeDF.joinsmallDF进行广播哈希连接。这样做有意义吗?@vincwng smallDF.joinlargeDF,right_outer仍然可以根据spark.sql.autoBroadcastJoinThreshold自动广播,广播功能可以应用于任何位置:broadcastlargeDF.joinsmallDF,SeqFoo在执行三个表(两个小表和一个大表)时,是否有一种方法可以使用sql api传递广播提示。谢谢