首页 > 解决方案 > 选择后的spark sql where子句

问题描述

考虑以下 spark-sql 查询:

  Seq(("b", 2), ("d", 4), ("a", 1), ("c", 3))
  .toDF("letter", "number")
  .select($"letter")
  .where($"number" > 1)
  .show

甚至可以拆分原始查询,并且行为仍然存在:

val letters =
  Seq(("b", 2), ("d", 4), ("a", 1), ("c", 3))
  .toDF("letter", "number")
  .select($"letter")

letters
  .where($"number" > 1)
  .show

这看起来与延迟加载有关,但是,我不确定这里到底发生了什么。

$"number"当只保留字母时,为什么可以在 where 子句中包含?

编辑1 这是解释:

letters.explain(true)
== Parsed Logical Plan ==
'Project [unresolvedalias('letter, None)]
+- Project [_1#76942 AS letter#76955, _2#76943 AS number#76956]
   +- LocalRelation [_1#76942, _2#76943]

== Analyzed Logical Plan ==
letter: string
Project [letter#76955]
+- Project [_1#76942 AS letter#76955, _2#76943 AS number#76956]
   +- LocalRelation [_1#76942, _2#76943]

== Optimized Logical Plan ==
LocalRelation [letter#76955]

== Physical Plan ==
LocalTableScan [letter#76955]

标签: scalaapache-sparkapache-spark-sql

解决方案


继承于 Spark 方法,在一个动作/作业中,在一个阶段内融合代码 --> 缩小转换。

Spark 将优化代码。这方面的例子很多。

val rdd1 = ...
val rdd2 = rdd1.map(...
val rdd3 = rdd2.map(...

在这个简单的示例中,由于代码的优化和融合,当 Action 发生时,甚至可能不会出现 rdd2、rdd1。

在您的情况下,您可以将它们融合在一起,并获得一个简单的本地表扫描。

您可以查看https://spoddutur.github.io/spark-notes/second_generation_tungsten_engine.html以了解融合代码,即全阶段代码生成。


推荐阅读