大数跨境
0
0

详解CTE在Spark中的执行计划【面试高频题】

详解CTE在Spark中的执行计划【面试高频题】 三石大数据
2025-10-27
0

推荐阅读文章列表

2025最新大数据开发面试笔记V7.0——试读

简历指导套餐4.0——对标大厂的PB级数仓项目

没有实习经历,还有机会进大厂吗

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 (
    | select1id100 score
    | unionall
    | select2id200 score
    | unionall
    | select3id300 score
    |) score
    |join info on score.id = info.id
    |""".stripMargin).show
// 2、不使用CTE表达式
spark.sql(
  """

    |select score.id, info.name, score.score
    |from (
    | select1id100 score
    | unionall
    | select2id200 score
    | unionall
    | select3id300 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笔记获取方式

公众号回复:大数据面试笔记

【声明】内容源于网络
0
0
三石大数据
专注于大数据开发相关技术以及面试经验分享
内容 205
粉丝 0
三石大数据 专注于大数据开发相关技术以及面试经验分享
总阅读11
粉丝0
内容205