Spark SQL Catalyst源码分析之TreeNode Library

本文深入剖析Spark SQL Catalyst的TreeNode库,涵盖BinaryNode、UnaryNode和Leaf Node三种类型,详解核心方法transform及其在Logical Plan优化中的作用。通过示例展示从UnResolved Logical Plan到executedPlan的转化过程。
摘要由CSDN通过智能技术生成

/** Spark SQL源码分析系列文章*/

    前几篇文章介绍了Spark SQL的Catalyst的核心运行流程SqlParser,和Analyzer,本来打算直接写Optimizer的,但是发现忘记介绍TreeNode这个Catalyst的核心概念,介绍这个可以更好的理解Optimizer是如何对Analyzed Logical Plan进行优化的生成Optimized Logical Plan,本文就将TreeNode基本架构进行解释。

    

 

一、TreeNode类型

   TreeNode Library是Catalyst的核心类库,语法树的构建都是由一个个TreeNode组成。TreeNode本身是一个BaseType <: TreeNode[BaseType] 的类型,并且实现了Product这个trait,这样可以存放异构的元素了。
   TreeNode有三种形态:BinaryNodeUnaryNodeLeaf Node
   在Catalyst里,这些Node都是继承自Logical Plan,可以说每一个TreeNode节点就是一个Logical Plan(包含Expression)(直接继承自TreeNode)

 

   主要继承关系类图如下:

 1、BinaryNode 

二元节点,即有左右孩子的二叉节点

 

 
  1. [[TreeNode]] that has two children, [[left]] and [[right]].

  2. trait BinaryNode[BaseType <: TreeNode[BaseType]] {

  3. def left: BaseType

  4. def right: BaseType

  5. def children = Seq(left, right)

  6. }

  7. abstract class BinaryNode extends LogicalPlan with trees.BinaryNode[LogicalPlan] {

  8. self: Product =>

  9. }

 节点定义比较简单,左孩子,右孩子都是BaseType。 children是一个Seq(left, right)

 

下面列出主要继承二元节点的类,可以当查询手册用 :)

这里提示下平常常用的二元节点:Join和Union

 2、UnaryNode

 

 一元节点,即只有一个孩子节点

 
  1. A [[TreeNode]] with a single [[child]].

  2. trait UnaryNode[BaseType <: TreeNode[BaseType]] {

  3. def child: BaseType

  4. def children = child :: Nil

  5. }

  6. abstract class UnaryNode extends LogicalPlan with trees.UnaryNode[LogicalPlan] {

  7. self: Product =>

  8. }

下面列出主要继承一元节点的类,可以当查询手册用 :)

 

常用的二元节点有,Project,Subquery,Filter,Limit ...等

3、Leaf Node 

 

叶子节点,没有孩子节点的节点。

 
  1. A [[TreeNode]] with no children.

  2. trait LeafNode[BaseType <: TreeNode[BaseType]] {

  3. def children = Nil

  4. }

  5. abstract class LeafNode extends LogicalPlan with trees.LeafNode[LogicalPlan] {

  6. self: Product =>

  7. // Leaf nodes by definition cannot reference any input attributes.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值