Zebing Lin

Zebing Lin

Developer. Triathlete.

© 2019

Spark SQL内核剖析(1)

DataFrame和RDD相比多了数据特性,拥有Schema信息;而Dataset进一步提供了类型安全和面向对象的编程接口。


Unresolved LogicalPlan -> Analyzed LogicalPlan -> Optimized LogicalPlan -> Iterator[PhysicalPlan] -> SparkPlan -> Prepared SparkPlan

InternalRow用来表示一行行数据的类。

  • BaseGenericRow 抽象类,实现了InternalRow中定义的所有get类型方法
  • JoinedRow 两个InternalRow放在一起形成新的InternalRow
  • UnsafeRow 不用Java对象存储方式,避免GC

TreeNode类是Spark SQL中所有树的基类,定义了一系列通用的集合操作和树便利操作接口。提供一种泛型,包含了两个子类QueryPlan和Expression体系。树的修改都是以替换已有节点的方式进行的:

  • transformDown 用先序遍历方式规则作用于所有节点
  • transformUp 用后序遍历方式将规则作用于所有节点

Expression

  • foldable 用来标记表达式能否在查询执行之前直接静态计算。1. 该表达式为Literal 2. 子表达式foldable均为true
  • deterministic 每次eval的输出是否都相同
  • nullable 标记表达式是否可能输出Null值,一般在生成的Java代码中对相关条件进行判断
  • references 返回AttributeSet类型,表示该Expression中会涉及的属性值,默认情况为所有子节点中属性值的集合
  • canonicalized 规范化后的表达式,去除Expr Id等等
  • semanticEquals 判断语义上是否等价