Apache spark sparksql广播散列联接
我正在尝试使用SparkSQL在数据帧上执行广播哈希连接,如下所述: 在该示例中,小数据帧通过saveAsTable持久化,然后通过sparksql进行连接,即通过sqlContext.SQL 我的问题是,我需要使用sparksqlapi来构造我的SQL,我只剩下用ID列表连接约50个表,不想手工编写SQLApache 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
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传递广播提示。谢谢