推荐阅读文章列表
CTE是什么
CTE(Common Table Expression,通用表表达式)是SQL中的一种临时命名结果集,可以在查询中多次引用。它使查询更易读和维护,特别是在复杂的查询中
CTE在Spark中的执行计划
// 1、使用CTE表达式
spark.sql(
"""
|with info as (
| select1id, 'ss1'name
| unionall
| select2id, 'ss2'name
| unionall
| select3id, 'ss3'name
|)
|select score.id, info.name, score.score
|from (
| select1id, 100 score
| unionall
| select2id, 200 score
| unionall
| select3id, 300 score
|) score
|join info on score.id = info.id
|""".stripMargin).show
// 2、不使用CTE表达式
spark.sql(
"""
|select score.id, info.name, score.score
|from (
| select1id, 100 score
| unionall
| select2id, 200 score
| unionall
| select3id, 300 score
|) score
|join (
| select1id, 'ss1'name
| unionall
| select2id, 'ss2'name
| unionall
| select3id, 'ss3'name
|) info on score.id = info.id
|""".stripMargin).show
-
根据上述两个代码的执行计划,可以非常直观的看出 不管是使用CTE表达式,还是使用子查询的方式,两者执行计划一样
+- == Final Plan ==
* Project (18)
+- * BroadcastHashJoin Inner BuildLeft (17)
:- BroadcastQueryStage (9), Statistics(sizeInBytes=1024.0 KiB, rowCount=3)
: +- BroadcastExchange (8)
: +- Union (7)
: :- * Project (2)
: : +- * Scan OneRowRelation (1)
: :- * Project (4)
: : +- * Scan OneRowRelation (3)
: +- * Project (6)
: +- * Scan OneRowRelation (5)
+- Union (16)
:- * Project (11)
: +- * Scan OneRowRelation (10)
:- * Project (13)
: +- * Scan OneRowRelation (12)
+- * Project (15)
+- * Scan OneRowRelation (14)
-
思考:上述案例是CTE单次引用,如果存在多次引用,那么每一次引用都需要重新计算一次,计算效率低下,此时如何优化呢?
CTE多次引用如何优化
-
可以通过cache或者persist的方式进行缓存临时视图
写在最后
V6.0笔记获取方式
公众号回复:大数据面试笔记

