scala - 选择后的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]
解决方案
继承于 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以了解融合代码,即全阶段代码生成。
推荐阅读
- mysql - 需要 SQL 建议
- javascript - .NET Core MVC - 带有前缀绑定的 AJAX POST 请求
- sharepoint - Powerpoint 演示文件在复制到 sharepoint 在线服务器后报告损坏
- git - 如何确定一个分支是否是 jenkins 文件中的默认分支?
- javascript - try..catch 标识符的正确 jsdoc 类型注释是什么?
- c# - 在 selenium 中检查 Web URL 是否有效
- machine-learning - 如果重量不断增加,如何调试。Pytorch 程序
- javascript - 我无法在反应组件中正确访问 redux 存储
- php - 尝试使用 PHP Laravel 获取非对象的属性“标题”
- reactjs - 在 React 的数据库中显示存储为路径字符串的图像