IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Calcite RelNode和RexNode 介绍 -> 正文阅读

[大数据]Calcite RelNode和RexNode 介绍

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_user

RelNode 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() {
        @Override
        public 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() {
        @Override
        public 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));
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:35:41  更:2022-09-21 00:39:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:59:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码