小编suj*_*jit的帖子

如何知道(广播)连接查询中的Spark作业和阶段的数量?

我使用Spark 2.1.2.

我试图了解各种火花UI选项卡显示作为一个工作运行.我使用spark-shell --master local并执行以下join查询:

val df = Seq(
  (55, "Canada", -1, "", 0),
  (77, "Ontario", 55, "/55", 1),
  (100, "Toronto", 77, "/55/77", 2),
  (104, "Brampton", 100, "/55/77/100", 3)
).toDF("id", "name", "parentId", "path", "depth")

val dfWithPar = df.as("df1").
  join(df.as("df2"), $"df1.parentId" === $"df2.Id", "leftouter").
  select($"df1.*", $"df2.name" as "parentName")

dfWithPar.show
Run Code Online (Sandbox Code Playgroud)

这是物理查询计划:

== Physical Plan ==
*Project [Id#11, name#12, parentId#13, path#14, depth#15, name#25 AS parentName#63]
+- *BroadcastHashJoin [parentId#13], [Id#24], LeftOuter, BuildRight
   :- LocalTableScan [Id#11, name#12, parentId#13, path#14, depth#15]
   +- …
Run Code Online (Sandbox Code Playgroud)

apache-spark apache-spark-sql

8
推荐指数
1
解决办法
2077
查看次数

为什么即使大小在 autoBroadcastJoinThreshold 下,spark (sql) 也不进行广播连接?

我正在使用 Spark 2.1.1。我有用 Spark SQL 编写的非常复杂的查询,我正在尝试对其进行优化。对于一个部分,我正在尝试使用广播连接。但即使我已经设置:

spark.sql.autoBroadcastJoinThreshold=1073741824

也就是 1GB,我看到 spark 生成的这部分执行的物理计划仍在使用 SortMergeJoin。您是否有任何见解为什么不使用广播连接,即使一侧的大小在 Spark UI -> SQL 选项卡上显示的要小得多(以 MB 为单位)?
我受影响部分的 SQL 代码部分如下所示:

-- Preceding SQL
(
SELECT  /*+ BROADCAST (a) */   -- Size of a is within broadcast threshold as per UI
     a.id,
     big.gid
 FROM
     (SELECT DISTINCT(id) AS id FROM a_par WHERE gid IS NULL) a
 JOIN
    big ON (a.id=big.id)
)
-- Succeeding SQL
Run Code Online (Sandbox Code Playgroud)

证实的 Spark UI 屏幕如下:

apache-spark apache-spark-sql

3
推荐指数
1
解决办法
1917
查看次数

标签 统计

apache-spark ×2

apache-spark-sql ×2