美文网首页
Calcite 若干概念说明

Calcite 若干概念说明

作者: ni_d58f | 来源:发表于2019-05-14 14:00 被阅读0次

1. Calcite中主要数据结构转化流程

Calcite数据结构转化

如图所示,SQL在Calcite中会经历以上流程,最终会生成优化过后的RelNode, 下面就以图中的各个点数据结构进行说明

2. SQL到SqlNode

通过Parser, 可以将Sql转化成SqlNode, 什么是SqlNode? SqlNode是Calcite中用于表达关系运算的中间数据结构,这么说可能有些抽象,可以看下图:


SqlNode

便于解释

select id, cast(score as int), 'hello' from T where id < ?

以上SQL中,

  1. id, score, T 等为SqlIdentifier
  2. cast()为SqlCall
  3. int 为SqlDataTypeSpec
  4. 'hello' 为SqlLiteral
  5. '?' 为SqlDynamicParam

进一步看


SqlCall

在Calcite中,所有的操作都是一个SqlCall, 如查询是一个SqlSelect, 删除是一个SqlDelete等,对应的查询条件等为SqlCall中的参数, 如代码所示

public class SqlSelect extends SqlCall {
  public static final int FROM_OPERAND = 2;
  public static final int WHERE_OPERAND = 3;
  public static final int HAVING_OPERAND = 5;

  SqlNodeList keywordList;
  SqlNodeList selectList;
  SqlNode from;
  SqlNode where;
  SqlNodeList groupBy;
  SqlNode having;
  SqlNodeList windowDecls;
  SqlNodeList orderBy;
  SqlNode offset;
  SqlNode fetch;

3. SqlNode 到SqlNode

此过程主要是根据定义的scheam, table, columns 来验证SqlNode是否合法。由于此过程中没有设计数据结构转化,先略过,后面会有文章专们针对validator进行说明

4. SqlNode到RelNode

此过程中SqlToRelConverter会将SqlNode转化成RelNode, 这其中主要涉及了以下几个数据结构

1. RelNode
关系表达式, 主要有TableScan, Project, Sort, Join等。如果SQL为查询的话,所有关系达式都可以在SqlSelect中找到, 如 where和having 对应的Filter, selectList对应Project, orderBy、offset、fetch 对应着Sort, From 对应着TableScan/Join等等, 示便Sql最后会生成如下RelNode树

     LogicalProject
         LogicalFilter
              LogicalTableScan

2. RexNode
行表达式, 如RexLiteral(常量), RexCall(函数), RexInputRef(输入引用)等, 还是这一句SQL select id, cast(score as int), 'hello' from T where id < ?, 其中id 为RexInputRef, cast为RexCall, 'hello' 为RexLiteral

3. Traits
转化特征,存在于RelNode中,目前有三种Traits: ConventionRelCollationRelDistributionConvention指的是改关系表达式所遵循的规范,如SparkConvention、PigConvention, 同一个关系表达式的所有输入必须含有相同的Convention. 可以通过ConverterRule将一个Convention转化成另一个Convention. RelCollation 指的是该关系表达式所定义数据的排序,比如说LogicalSort 中如果RelCollation标识数据如果已经是排序好了,可以消除LogicalSort. RelDistribution 标识数据的分布特点。

4. Rule
转化规则,可以将一个RelNode 转化另一种RelNode, 目前Calcite主要有两种Rule.
4.1 直接继承RelOptRule。 这种类型的Rule主要作用是将一个关系表达式转化成等价的另一种表达式
4.2 继承ConverterRule.将RelNode的Convention转化成另一种Convention

5. Planners
优化器。主要有两种HepPlannerVolcanoPlanner分别对应着RBO和CBO优化器

3. Optimizer 将RelNode 转化成另一种RelNode

此过程是利用Planner进行RBO和CBO优化,请参考后面关于RBO和CBO的介绍

总结

Calcite 执行计划生成主要的数据结构在SqlNode和RelNode中,特别是RelNode, 其包含了许多为后面优化设置的数据结构如trait。

SqlNode 生成逻辑在Parser中,具体逻辑请参考Calcite中定制自已SQL解析器

RelNode 主要是通过调用SqlToRelConverter生成,后面会用篇幅详细介绍这一过程

Calcite 中还有许多相关数据结构,读者如果感兴趣,请自行阅读原码

相关文章

  • Calcite 若干概念说明

    1. Calcite中主要数据结构转化流程 如图所示,SQL在Calcite中会经历以上流程,最终会生成优化过后的...

  • calcite基础概念

    1. 背景 Apache Calcite 是面向 Hadoop 新的查询引擎,它提供了标准的 SQL 语言、多种查...

  • Apache Calcite简介

    文章导读: 什么是Calcite? Calcite的主要功能? 如何快速使用Calcite? 什么是Calcite...

  • Apache Calcite(一):初识

    Apache Calcite(一):初识 搬运翻译自Apache Calcite 1.背景 Calcite can...

  • 若干概念

    1. 框计算(Box Computing)产生于2009年8月18日,百度董事长兼首席执行官李彦宏在2009百度技...

  • Apache Calcite Rexnode Optimize

    这个文档主要说明在Apache Calcite中如何对谓词进行优化的。先列举几个场景说明一下这个文档主要论述的问题...

  • 【Flink SQL】Apache Calcite 架构剖析

    1.简介和架构 Apache Calcite[https://calcite.apache.org/docs/] ...

  • AngularJS若干概念

    1. 什么是数据绑定(Data Binding)? 参考自官方文档 数据绑定是指在Model和View之间进行的数...

  • 【Flink SQL】如何利用 Calcite 扩展 Flink

    1.Calcite 如何实现 sql 语法的解析 Calcite 使用 javacc 作为语法解析器[https:...

  • Apache Calcite 简介

    1. 什么是Apache Calcite ? Apache Calcite 是一款开源SQL解析工具, 可以将各种...

网友评论

      本文标题:Calcite 若干概念说明

      本文链接:https://www.haomeiwen.com/subject/gjajaqtx.html