pyspark中SQL中的多视图广播
我想在连接一个大表时在多个小表上使用广播提示。在下面的示例中,SMALLTABLE2在不同的连接列上多次与LARGETABLE连接。现在,为了获得更好的性能,我希望同时广播SMALLTABLE1和SMALLTABLE2。这可以通过简单地添加提示/*广播(B、C、D、E)*/或者有更好的解决方案来实现吗?SMALLTABLE1&SMALLTABLE2我通过查询数据帧中的配置单元表,然后使用createOrReplaceTempView创建一个作为SMALLTABLE1&SMALLTABLE2的视图来获取数据;这将在下面的查询中使用 是否有使用createOrReplaceTempView函数创建的广播视图pyspark中SQL中的多视图广播,pyspark,broadcast,Pyspark,Broadcast,我想在连接一个大表时在多个小表上使用广播提示。在下面的示例中,SMALLTABLE2在不同的连接列上多次与LARGETABLE连接。现在,为了获得更好的性能,我希望同时广播SMALLTABLE1和SMALLTABLE2。这可以通过简单地添加提示/*广播(B、C、D、E)*/或者有更好的解决方案来实现吗?SMALLTABLE1&SMALLTABLE2我通过查询数据帧中的配置单元表,然后使用createOrReplaceTempView创建一个作为SMALLTABLE1&SMALLTABLE2的视图
SELECT A.COL1, A.COL2, A.COL3, B.COL4, C.COL5, D.COL6, E.COL7
FROM LARGETABLE A
JOIN SMALLTABLE1 B
ON A.LCOL = B.SCOL
JOIN SMALLTABLE2 C
ON A.LCOL1 = C.SCOL
JOIN SMALLTABLE2 D
ON A.LCOL2 = D.SCOL
JOIN SMALLTABLE2 E
ON A.LCOL3 = E.SCOL
如果您使用的是spark 2.2+,则可以使用以下任何提示
MAPJOIN/BROADCAST/BROADCASTJOIN
有关此功能的更多详细信息,请参阅Jira和
示例:下面我已经使用了广播,但是您可以使用映射连接/broadcastjoin提示将产生相同的解释计划
(或)
如果您使用的是Spark<2,那么我们需要使用dataframeapi来持久化,然后注册为临时表,这样我们就可以实现内存中的连接
>>> df=hc.range(10000000)
>>> df.persist() --persist the df in memory
>>> df.registerTempTable("u") --register temp table
>>> df1=hc.range(10000000)
>>> df1.persist()
>>> df1.registerTempTable("t")
>>> hc.sql("select * from t join u on t.id=u.id").explain()
== Physical Plan ==
Project [id#11L,id#26L]
+- SortMergeJoin [id#11L], [id#26L]
:- Sort [id#11L ASC], false, 0
: +- TungstenExchange hashpartitioning(id#11L,200), None
: +- InMemoryColumnarTableScan [id#11L], InMemoryRelation [id#11L], true, 10000, StorageLevel(false, true, false, false, 1), ConvertToUnsafe, None
+- Sort [id#26L ASC], false, 0
+- TungstenExchange hashpartitioning(id#26L,200), None
+- InMemoryColumnarTableScan [id#26L], InMemoryRelation [id#26L], true, 10000, StorageLevel(false, true, false, false, 1), ConvertToUnsafe, None
使用数据帧而不创建任何临时表
此外,广播连接在Spark中自动完成
有一个参数是“spark.sql.autoBroadcastJoinThreshold”,默认设置为10mb
然后更改默认值
conf.set("spark.sql.autoBroadcastJoinThreshold", 1024*1024*<mb_value>)
conf.set(“spark.sql.autoBroadcastJoinThreshold”,1024*1024*)
有关更多信息,请参阅有关spark.sql.autoBroadcastJoinThreshold的链接
>>>from pyspark.sql.functions import *
>>> df=hc.range(10000000)
>>> df1=hc.range(10000000)
>>> df.join(broadcast(df1),['id']).explain()
== Physical Plan ==
Project [id#26L]
+- BroadcastHashJoin [id#26L], [id#11L], BuildRight
:- ConvertToUnsafe
: +- Scan ExistingRDD[id#26L]
+- ConvertToUnsafe
+- Scan ExistingRDD[id#11L]
conf.set("spark.sql.autoBroadcastJoinThreshold", 1024*1024*<mb_value>)