首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >sparksql源码系列 | ResolveReferences规则count(*)详解

sparksql源码系列 | ResolveReferences规则count(*)详解

作者头像
数据仓库践行者
发布于 2022-06-09 13:30:14
发布于 2022-06-09 13:30:14
57500
代码可运行
举报
运行总次数:0
代码可运行

本文基于spark 3.2

这篇文章是做上次源码调试分享上留的一个作业题

1、select * from TESTDATA2,分析一下【*】的情况,看看是怎么把【*】转化为对应字段的。匹配ResolveReferences中的这段代码:case p: Project if containsStar(p.projectList) => p.copy(projectList = buildExpandedProjectList(p.projectList, p.child))

sql:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from testdata2

对应astTree:

unresolved logical plan 、resolved Logical Plan 以及这中间用到的规则:

生成resolved Logical Plan用的所有规则一览

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

==  Parsed Logical Plan  ==
'Project [*]
+- 'UnresolvedRelation [testdata2], [], false


//*********************** 规则1************************
org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations
'Project [*]
+- SubqueryAlias testdata2
   +- View (`testData2`, [a#3,b#4])
      +- SerializeFromObject [knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).a AS a#3, knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).b AS b#4]
         +- ExternalRDD [obj#2]

//*********************** 规则2************************
org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveReferences
Project [a#3, b#4]
+- SubqueryAlias testdata2
   +- View (`testData2`, [a#3,b#4])
      +- SerializeFromObject [knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).a AS a#3, knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).b AS b#4]
         +- ExternalRDD [obj#2]

== Analyzed Logical Plan ==
Project [a#3, b#4]
+- SubqueryAlias testdata2
   +- View (`testData2`, [a#3,b#4])
      +- SerializeFromObject [knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).a AS a#3, knownnotnull(assertnotnull(input[0, org.apache.spark.sql.test.SQLTestData$TestData2, true])).b AS b#4]
         +- ExternalRDD [obj#2]

源码过程分析

主要看Project [*] 是怎么转化为 Project [a#3, b#4] 的,ResolveReferences 规则的作用在源码共读分享上说过了:

主要是把 UnresolvedAttribute 替换为AttributeReference

从代码,可以看到,把*展开,用的是buildExpandedProjectList方法:

【*】是UnresolvedStar,UnresolvedStar是Star的子类:

所以,会走第一个case,expand方法,而expand最终调用了UnresolvedStar 的 expand 方法:

我们来debug康康input.output 里面有啥:

这里的input是SubqueryAlias节点,output方法,实际上就是遵循逻辑执行计划的output方法,这个在上一次的源码共读分享中很详细的讲过了:

最后,总结一下:output每一步都是根据底部已经resloved的Attribute来给顶部的Attribute赋值,从而保证两个Attribute是指向同一个。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库践行者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
再来说说sparksql中count(distinct)原理和优化手段吧~
元旦前一周到现在总共接到9个sparksql相关的优化咨询,这些案例中,有4个和count(distinct)有关。
数据仓库践行者
2024/01/16
2.3K0
再来说说sparksql中count(distinct)原理和优化手段吧~
SparkSql不同写法的一些坑(性能优化)
这种情况也是我经常会遇到的一个场景,之前也有同学拿着sql来问,说这样写会不会影响运行效率:
数据仓库践行者
2022/11/25
8651
sparksql源码系列 | 一文搞懂with one count distinct 执行原理
今天下午的源码课,主要是对上两次课程中留的作业的讲解,除了几个逻辑执行计划的优化器外, 重点是planAggregateWithOneDistinct(有一个count distinct情况下生成物理执行计划的原理)。
数据仓库践行者
2022/06/09
1.2K0
sparksql源码系列 | 一文搞懂with one count distinct 执行原理
SparkSql窗口函数源码分析(第一部分)
WindowExpression :描述该expression是一个windowExpression,继承BinaryLike,是一个二元树。
数据仓库践行者
2022/11/25
1.2K0
SparkSql窗口函数源码分析(第一部分)
SparkSql序列化时列的ID是在哪里生成的呢?
sparksql生成解析后的逻辑执行计划时,会通过catalog把各个字段和元数据库绑定,也就说在ResolveLogical的阶段的字段是带了id的:
数据仓库践行者
2022/11/25
8650
SparkSql序列化时列的ID是在哪里生成的呢?
Spark sql 生成PhysicalPlan(源码详解)
QueryExecution.createSparkPlan -> (SparkPlanner.plan)SparkStrategies.plan ->QueryPlanner.plan
数据仓库践行者
2020/11/09
1.1K0
Spark sql 生成PhysicalPlan(源码详解)
SparkSql全代码生成规则梳理-CollapseCodegenStages
火山模型(迭代器模型), 是1994年 Goetz Graefe 在他的论文 《Volcano, An Extensible and Parallel Query Evaluation System》中提出的概念。
数据仓库践行者
2022/11/25
1.5K0
SparkSql全代码生成规则梳理-CollapseCodegenStages
sparksql源码系列 | 一文搞懂Distribution源码体系(spark3.2)
这篇文章主要介绍sparksql中Distribution的源码体系,Distribution是我们理解Physical Plan、executed Plan、shuffle、SparkSQL的AQE机制等的一个比较基础的知识点。
数据仓库践行者
2022/06/09
1.3K0
sparksql源码系列 | 一文搞懂Distribution源码体系(spark3.2)
spark sql解析过程中对tree的遍历(源码详解)
Parsed Logical Plan, Analyzed Logical Plan, Optimized Logical Plan, Physical Plan
数据仓库践行者
2020/10/29
1.5K0
spark sql解析过程中对tree的遍历(源码详解)
额,关于笛卡尔积CartesianProduct
如果这样理解的话,就会很矛盾,笛卡尔积的依赖中,一个父RDD的分区明明被多个子RDD的分区消费了,可它是窄依赖
数据仓库践行者
2022/11/25
6110
额,关于笛卡尔积CartesianProduct
SparkSql源码成神之路
快来加入我的源码学习社群吧,在社群的长期陪伴下,解决你在学习路上遇到的点点滴滴的问题~~
数据仓库践行者
2022/11/24
1.1K0
SparkSql源码成神之路
sparksql源码系列 | 生成resolved logical plan的解析规则整理
之前有分享过一篇笔记:Spark sql规则执行器RuleExecutor(源码解析) 里面有提到Analyzer、Optimizer定义了一系列 rule。 其中Analyzer定义了从【未解析的逻辑执行计划】生成【解析后的逻辑执行计划】的一系列规则,这篇笔记整理了一下这些规则都哪些。 基于spark3.2 branch rule【规则】 batch【表示一组同类的规则】 strategy【迭代策略】 注释 OptimizeUpdateFields Substitution fixedPoint 此
数据仓库践行者
2022/04/18
4.1K0
sparksql源码系列 | 生成resolved logical plan的解析规则整理
Spark SQL / Catalyst 内部原理 与 RBO
从上图可见,无论是直接使用 SQL 语句还是使用 DataFrame,都会经过如下步骤转换成 DAG 对 RDD 的操作
Jason Guo
2018/09/11
1.5K0
SparkSql LogicalPlan的resolved变量
logicalplan分unresolved logical plan和resolved logical plan,resolved可以被子类重写。
数据仓库践行者
2021/02/02
6510
通过扩展 Spark SQL ,打造自己的大数据分析引擎
Spark SQL 的 Catalyst ,这部分真的很有意思,值得去仔细研究一番,今天先来说说Spark的一些扩展机制吧,上一次写Spark,对其SQL的解析进行了一定的魔改,今天我们按套路来,使用砖厂为我们提供的机制,来扩展Spark...
麒思妙想
2021/06/15
1.5K0
通过扩展 Spark SQL ,打造自己的大数据分析引擎
【硬刚大数据】从零到大数据专家面试篇之SparkSQL篇
Spark SQL是一个用来处理结构化数据的Spark组件,前身是shark,但是shark过多的依赖于hive如采用hive的语法解析器、查询优化器等,制约了Spark各个组件之间的相互集成,因此Spark SQL应运而生。
大数据真好玩
2021/09/18
2.5K0
【硬刚大数据】从零到大数据专家面试篇之SparkSQL篇
SparkSql的Catalyst之图解简易版
一,基本介绍 一言不合就上图。 由上图可以看出Catalyst的作用尤为重要。MLPipelines Structured Streaming,GraphFrames都是基于DataFrame和Dat
Spark学习技巧
2018/01/30
1.1K0
SparkSql的Catalyst之图解简易版
Spark SQL Limit 介绍及优化
全局限制,最多返回 limitExpr 对应条 records。总是通过 IntegerLiteral#unapply(limitExpr: Expression): Option[Int] 将 limitExpr 转换为 Int。
codingforfun
2018/09/27
3.8K0
Spark SQL Limit 介绍及优化
SparkSql的优化器-Catalyst
一,概述 为了实现Spark SQL,基于Scala中的函数编程结构设计了一个新的可扩展优化器Catalyst。Catalyst可扩展的设计有两个目的。 首先,希望能够轻松地向Spark SQL添加新的优化技术和功能,特别是为了解决大数据(例如,半结构化数据和高级分析)所遇到的各种问题。第二,我们希望使外部开发人员能够扩展优化器 - 例如,通过添加可将过滤或聚合推送到外部存储系统的数据源特定规则,或支持新的数据类型。Catalyst支持基于规则(rule-based)和基于成本(cost-based)的优化
Spark学习技巧
2018/01/30
2.9K0
SparkSql的优化器-Catalyst
SparkSQL真的不支持存储NullType类型数据到Parquet吗?
最近后台有小伙伴提了一些实际工作中使用Spark遇到的问题,笔者挑选了几个相对常见的问题,分别从场景模拟/问题现象、问题分析、解决方案三个层面,来深入分析这些问题,并且提供一个解决类似问题的思路。
大数据学习与分享
2020/11/03
2.9K0
SparkSQL真的不支持存储NullType类型数据到Parquet吗?
相关推荐
再来说说sparksql中count(distinct)原理和优化手段吧~
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档