文章目录

  • SQL 数据处理流程
  • RelNode
    • LogicalTableScan,扫描整表
    • LogicalSort 排序
    • LogicalProject 投影
    • LogicalFilter 过滤
    • LogicalJoin 双表join
    • LogicalMinus 差集
    • LogicalUnion union 并集
    • LogicalAggregate 分组操作
  • ReXNode
    • RexLiteral 常量表达式
    • RexInputRef 输入引用符
    • RexCall 多个操作符构建的表达式
  • 参考代码

SQL 数据处理流程

RelNode

RelNode 是关系表达式,主要描述处理数据的关系,比如何sort ,join,投影,过滤,扫描

LogicalTableScan,扫描整表

// SQL 表示
select *
from
test_user// 关系表达式生成RelNode root = builder.scan("test_user").build();//实际生成的逻辑计划LogicalTableScan(table=[[test_user]])

LogicalSort 排序

// SQL 表示
select id,name
from test_user
group  by id// 关系表达式生成RelNode root =builder.scan("test_user").sort(0).build();//实际生成的逻辑计划
LogicalSort(sort0=[$0], dir0=[ASC])LogicalTableScan(table=[[test_user]])             

LogicalProject 投影

// SQL 表示
select id
from test_user// 关系表达式生成
RelNode root = builder.scan("test_user").project(builder.field("id")).build();//实际生成的逻辑计划
LogicalProject(id=[$0])LogicalTableScan(table=[[test_user]])

LogicalFilter 过滤

// SQL 表示
select * from test_user where id=10// 关系表达式生成
RelNode root = builder.scan("test_user").filter(builder.equals(builder.field(0),builder.literal(10))).build();//实际生成的逻辑计划
LogicalFilter(condition=[=($0, 10)])LogicalTableScan(table=[[test_user]])

LogicalJoin 双表join

// SQL 表示
select * from test_user join test_address
on  test_user.id=test_address.id// 关系表达式生成
RelNode root = builder.scan("test_user")
.scan("test_address").join(JoinRelType.INNER, builder.field("id"))    .build();//实际生成的逻辑计划
LogicalJoin(condition=[$0], joinType=[inner])LogicalTableScan(table=[[test_user]])LogicalTableScan(table=[[test_address]])

LogicalMinus 差集

// 关系表达式生成
RelNode root = builder.scan("test_user").scan("test_address").minus(true).build();//实际生成的逻辑计划     LogicalMinus(all=[true])LogicalTableScan(table=[[test_user]])  LogicalTableScan(table=[[test_address]])
LogicalMinus  交集// 关系表达式生成
RelNode root = builder.scan("test_user").scan("test_address").intersect(true).build();//实际生成的逻辑计划
LogicalIntersect(all=[true])LogicalTableScan(table=[[test_user]])LogicalTableScan(table=[[test_address]])

LogicalUnion union 并集

// SQL 表示
select id,name from test_user
union all
select id,address as name from
test_address// 关系表达式生成
RelNode root = builder.scan("test_user").scan("test_address").union(true).build();//实际生成的逻辑计划
LogicalUnion(all=[true]) LogicalTableScan(table=[[test_user]]) LogicalTableScan(table=[[test_address]])

LogicalAggregate 分组操作

// SQL 表示
select
id,max(name)
from
test_user
group by id// 关系表达式生成
RelNode root = builder.scan("test_user").aggregate(builder.groupKey("id"), builder.max(builder.field("name"))).build();//实际生成的逻辑计划
LogicalAggregate(group=[{0}], agg#0=[MAX($1)])LogicalTableScan(table=[[test_user]])

ReXNode

RexNode 主要表示的对数据行的处理

RexLiteral 常量表达式

//SQL 表示
select * from user where id=1
1 就是常量
builder.literal(10)RelNode root = builder.scan("test_user").filter(builder.equals(builder.field("id"),builder.literal(10))).build();LogicalFilter(condition=[=($0, 10)])LogicalTableScan(table=[[test_user]])

RexInputRef 输入引用符

//SQL 表示
select id from test_userRelNode root = builder.scan("test_user").project(builder.field(0)).build();//这里builder.filed(0) 返回的就是第一个元素
//逻辑计划
LogicalProject(id=[$0])LogicalTableScan(table=[[test_user]])

RexCall 多个操作符构建的表达式

select id,case name='ming' then null else name
end  from test_user
比如这里的
case name='ming' then null else name
end RexSubQuery 子查询select * from test_user where id existes  (10,40)RelNode root = builder.scan("test_user").filter(builder.call(SqlStdOperatorTable.EXISTS, builder.field(0), builder.literal(10), builder.literal(40))).build();LogicalFilter(condition=[EXISTS($0, 10, 40)])LogicalTableScan(table=[[test_user]])

参考代码

public static Frameworks.ConfigBuilder config() {SchemaPlus schemaPlus = Frameworks.createRootSchema(true);schemaPlus.add("test_user", new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {List<RelDataType> dataTypeList = new ArrayList<>();RelDataType integerDataType = typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.BIGINT), true);RelDataType stringDataType = typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.VARCHAR), true);dataTypeList.add(integerDataType);dataTypeList.add(stringDataType);List<String> fieldNames = new ArrayList<>();fieldNames.add("id");fieldNames.add("name");return typeFactory.createStructType(dataTypeList, fieldNames);}});schemaPlus.add("test_address", new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {List<RelDataType> dataTypeList = new ArrayList<>();RelDataType integerDataType = typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.BIGINT), true);RelDataType stringDataType = typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.VARCHAR), true);dataTypeList.add(integerDataType);dataTypeList.add(stringDataType);List<String> fieldNames = new ArrayList<>();fieldNames.add("id");fieldNames.add("address");return typeFactory.createStructType(dataTypeList, fieldNames);}});return Frameworks.newConfigBuilder().parserConfig(SqlParser.Config.DEFAULT).defaultSchema(schemaPlus).traitDefs((List<RelTraitDef>) null).programs(Programs.heuristicJoinOrder(Programs.RULE_SET, true, 2));
}public static void main(String[] args) {RelBuilder builder = RelBuilder.create(config().build());RelNode root = builder.scan("test_user").build();System.out.println(RelOptUtil.toString(root));
}

Calcite RelNode和RexNode 介绍相关推荐

  1. 【Calcite】Apache Calcite 框架初探及概念详解

    1. 简介 Calcite 是什么?如果用一句话形容 Calcite,Calcite 是一个用于优化异构数据源的查询处理的基础框架. 最近十几年来,出现了很多专门的数据处理引擎.例如列式存储 (HBa ...

  2. 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架

    1.概述 转载:Flink 源码阅读笔记(15)- Flink SQL 整体执行框架 在数据处理领域,无论是实时数据处理还是离线数据处理,使用 SQL 简化开发将会是未来的整体发展趋势.尽管 SQL ...

  3. Flink 流批一体的实践与探索

    自 Google Dataflow 模型被提出以来,流批一体就成为分布式计算引擎最为主流的发展趋势.流批一体意味着计算引擎同时具备流计算的低延迟和批计算的高吞吐高稳定性,提供统一编程接口开发两种场景的 ...

  4. 95-908-030-源码-FlinkTable-Table API

    文章目录 1.美图 2.概述 1.美图 2.概述 ​ 除了使用纯 SQL 语句的方式外, Flink 还支持 Table API 编程,对 Table API 的支持主要借助 Table, Opera ...

  5. 33张图解flink sql应用提交(建议收藏!)

    前言 大家好,我是土哥. 这已经是我为读者写的第21篇 Flink系列文章了. 上周有粉丝在群里问,在流计算平台编写完Flink sql后,为什么通过一键提交按钮,就可以将sql提交到yarn集群上面 ...

  6. calcite mysql_Apache顶级项目 Calcite使用介绍

    什么是Calcite Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL解析.SQL校验.SQL查询优化.SQL生成以及数据连接查询等,但是又省略了一些 ...

  7. Calcite parser config介绍

    Calcite针对SQL parse提供了很多的配置项,可以针对不同的SQL方言进行解析.相关的配置项都存储在SqlParser.Config这个结构中,常见的用法如下所示: SqlParser.Co ...

  8. Apache Calcite概念介绍

    一.介绍 1.简介 ● Apache Calcite是面向Hadoop新的查询引擎,它提供了标准的SQL语言.多种查询优化和连接各种数据源的能力. ● Calcite的目标是" one si ...

  9. 【Calcite源码学习】ImmutableBitSet介绍

    Calcite中实现了一个ImmutableBitSet类,用于保存bit集合.在很多优化规则和物化视图相关的类中都使用了ImmutableBitSet来保存group by字段或者聚合函数参数字段对 ...

最新文章

  1. 父类卡子类卡java_Java中关于子类覆盖父类的抛出异常问题
  2. 前后端分离时代,Java 程序员的变与不变!
  3. sdut2784cf 126b Good Luck!(next数组)
  4. 多模态AI开发套件HiLens Kit:超强算力彰显云上实力
  5. qchart 怎么点击一下 出一条线_mastercam9.1教程之Mastercam9.1数控编程里面怎么出多个坐标系...
  6. request.setAttribute()与getParameter() 的区别
  7. 让memcached和mysql更好的工作
  8. heart ultrasound from american society of echocardiography
  9. python目标函数_python遗传算法目标函数怎么编
  10. postman汉化包下载
  11. 简单易懂的Kubernetes(K8S)之Pod资源管理与harbor创建
  12. 【Serenity BDD】Serenity 2.2.0 版本变动说明及相应的配置变动
  13. 在jsp中引入jQuery
  14. 2015年杭电计算机存储器扩展,杭电计算机组成原理存储器设计实验5
  15. 基金 thread.php,这个时候,我们可以为基金“上会通过”做点什么?(附方案) - 基金申请 - 小木虫 - 学术 科研 互动社区...
  16. bootchart使用
  17. STM32项目设计:基于STM32F1的智能门锁PCB、源码(4种解锁方式)
  18. 韩国国会表决通过中韩自贸协定批准案
  19. 基于公式画圆【c++】
  20. 单一世界架构初探之边界冲突

热门文章

  1. 深信服2022校招C++二面
  2. 注册kaggle人机验证没有验证码
  3. 金士顿DT101 G2 旋转盘量产教程 还可刷固件
  4. Jenkins-工作区清理插件
  5. 知乎 mysql in 与 join_join和join in之间有什么区别?
  6. 用友ERP U8软件安装
  7. Vue 订单(查询+展示+收货地址)
  8. 学习笔记3分支--学习笔记2-候选区域算法
  9. PTA 厘米换算英尺英寸
  10. Echarts使用总结(一)