关于SparkSQL-parse的三个疑问

上篇文章的结尾我提到了SQLParse过程中有三个关键的概念

1.数据处理时,如何表示数据?
2.树中间结构数据究竟是什么,如何表示?
3.如何理解解说席规则中的表达式?

Spark Sql实际转换过程如下:

在这里插入图片描述

逻辑计划和物理计划部分都和spark底层RDD平台无关,它主要靠基础架构Catalyst完成,于是该问题即是Catalyst架构中的三个疑问。

1 InternalRow.scala

SparkSQL以“行”作为单位操作数据,InternalRow则是表示行数据的类.主要方法包括numfields,update,以及每个列的get和set方法,InternalRow根据下标索引方式实现对列元素的操作.

该类的具体实现包括三大直接子类BaseGenericinternalRow, UnsafeRow, JoinedRow

1.BaseGenericinternalRow:
	在下一级子类中通过调用类中定义的genericGet虚函数实现InternalRow中定义的所有get类型方法
2.UnsafeRow:
	取消Java对象存储的方式,避免了JVM GC的代价。 此外对行数据进行特定编码,使存储更加高效
3.JoinedRow:
	该类主要用于 Join 操作,将两个 InternalRow 放在一起形成新的InternalRow

2 TreeNode.scala

SparkSQL中所有树类型的基类,TreeNode 提供的仅仅是一种泛型,提供了一整套树基本操作
	1)collectLeaves(获取所有当前EX树的叶子节点)
	2)collectFirst(先序遍历所有节点并返回第一个满足条件的节点)
	3)withnewChildren(将当前节点的子节点替换为新的子节点)
	4)transformDown(先序遍历方式将规则作用于所有节点)
	5)transformUp(后序遍历将规则作用于所有节点)
	6)transformChildren(递归方式将规则作用于所有节点)
	
	样例类Origin实现节点位置定位功能,提供了line(行)和startPosition(偏移量)参数,CurrentOrigin对象提供set和get操作,其中的withOrigin方法支持在TreeNode执行操作同时修改origin信息.
	

TreeNode是Expression和QueryPlan的父类,而QueryPlan是上篇文章提到的LogicalPlan(逻辑计划)和SparkPlan(物理计划)的父类.

3 expressions(表达式)

expressions通常会在算子执行前与其进行绑定,将表达式与输入的属性对应,同时表示算子可以调用expressions处理相应的逻辑

Expression.scala类中主要五个操作:
1.核心操作; 2.输入输出; 3.基本属性; 4.等价判断; 5.字符串表示

3.1 核心操作
eval函数实现表达式对应的处理逻辑,也是其他模块调用表达式的主要接口,其中genCode和doGenCode方法用来生成对应的java代码。
3.2 输入输出
flatArguments:参数扁平化
checkInputDataTypes:检查输入数据类型,有效返回typecheckresult.success,无效则返回typecheckresult(需要在childrenresolved==true后调用,否则无效)
references:默认情况返回所有子节点中属性值的集合
datatype:返回此表达式计算结果的datatype
3.3 基本属性
foldable:标记表达式能否在查询执行前直接静态计算
nullable:标记表达式是否可能输出null值
resolved:标记此表达式及其所有子级是否解析并通过输入数据类型检查
deterministic:标记当前表达式是否为固定输入返回相同结果
childrenResolved:标记当前表达式所有子级是否解析
3.4 等价判断
canonicalized:返回经过规范化处理的表达式
semanticHash:返回该表达式执行计算的"hashcode"
semanticEquals:当两个表达式(相同或不同)总是计算相同结果时返回true
3.5 字符串表示
prettyName:返回此表达式名称,通常与SQL函数名匹配
sql:返回表达式的SQL表示形式

在 Spark SQL 中, Expression 本身也是 TreeNode 类的子类,因此能够调用所有 TreeNode 的方法,例如 transform 等,也可以通过多级的子 Expression 组合成复杂的 Expression 。

至此 三个疑问已解决,明天开启我的analyzer阅读之路

猜你喜欢

转载自blog.csdn.net/wc188566/article/details/107545026