前言

calcite是一个可以将任意数据查询转换成基于sql查询的引擎,引擎特性也有很多,比如支持sql树的解析,udf的扩展,sql执行优化器的扩展等等。目前已经被很多顶级apache项目引用,比如hive,kylin等。在这个SQL作为主流的数据查询语言大数据世界里,calcite的作用会越来越大。

理解calcite的核心流程

如图1所示。calcite核心步骤有两个,数据关系化, SQL解析执行。

图1 calcite核心流程

数据协议关系化

要想使用sql进行查询,首先要把非结构化数据结构化,而calcite号称支持所有数据协议,则必然得将这部分内容抽象出来。

在calcite的接口中,Schema和Table是数据关系化中最重要的两个接口。Schema是对catalog或者是database的抽象,以兼容已经存在的各类数据库,Table是对表,视图,流的抽象,以兼容数据的各种场景,下面详细描述一下这两种抽象。

schema

calcite利用schema的层级关系,构造出来namespace的概念,如图2所示,schema自身是一个树形结构,这样设计的优点很明显,可以兼容所有已知和未知的数据库,基于namespace结构,schema无论是横向还是纵向都可以无限扩展。

图2 schema的namespace

在实际应用中,RootSchema是根所有schema的路径,所有注册在RootSchema上的table或者是udf都是全局的,意思就是说可以被SubSchema直接使用,而注册在SubSchema里的table或者是udf,则在使用中必须声明是哪个SubSchema拥有的。

table

table是schema的核心属性,一个schema拥有多个table,这就像一个数据库中有很多表一样。而table的概念更为广泛,为了兼容到各类数据库或者消息队列,calcite将table类型细分为TableType,基本的类似传统关系型数据库中的表或者视图,流式的Stream等。

另外对数据协议的兼容是非常重要的,像json,csv,xml等等,table抽象出了RelDataType接口,目的是将应用层的数据协议转关系化,从而可以为sql服务。

拿csv格式的数据来说,假设csv数据的每一行数据和table中的每一行一一对应,那么在关系化的过程中,必须将csv中每个字段的类型及一些元数据定义清晰,比如字段是int类型还是long类型,主键是哪个字段,外键是哪个字段等,calcite提供了几乎所有已存在的字段类型。

关于嵌套数据,calcite也考虑的很周全,提供MapSqlType或者ArraySqlType的形式来兼容这些结构。

拿json格式的数据来说,字段嵌套是很常见的,如果想把这类结构数据关系化,通常有两种选择(1)数据扁平化,将嵌套的字段提上来,形成a.b的形式(2)通过calcite引擎声明嵌套字段及规则,在使用sql查询的时候再通过calcite的表达式提取这些字段。

SQL解析执行

到了这一步,其实和传统数据库很像了,如图3所示,calcite采用了该方案来解决从sql的输入到输出。

calcite通过关系代数来实现对sql的执行,而关系代数之间通过树形结构作为载体,每一个输入的sql命令都会被转换成树形结构的关系代数也就是关系表达式树。calcite支持直接构建关系表达式树,通过RelBuilder接口。

注:关系代数,常见的有(交,并,差,投影,选择,笛卡尔积,连接)

图3

案例

完整案例

calcite提供了基于json和csv的案例,在calcite-example模块下,另外在该模块的单元测试中,有一些完整的例子。

sql解析案例

// 可以通过SqlParser直接对sql语句作解析,返回的就是sql树。

SqlParser sqlParser = SqlParser.create("select * from \"table\" where \"column\" > 1 limit 1");
SqlNode sqlNode = sqlParser.parseQuery(); if(sqlNode instanceof SqlCall){
if(sqlNode instanceof SqlBasicCall){
SqlBasicCall basicCall = (SqlBasicCall) sqlNode;
System.out.println(((SqlIdentifier)basicCall.operand(0)).getSimple());
System.out.println(((SqlNumericLiteral)basicCall.operand(1)).getValue());
System.out.println(basicCall.getKind());
}
System.out.println(sqlNode.getKind()+" -> "+sqlNode.getClass());
SqlCall call = (SqlCall) sqlNode;
for(SqlNode node: call.getOperandList()){
parse(node);
}
}

 

引用

// calcite官网

http://calcite.apache.org/docs/tutorial.html

// calcite github

https://github.com/apache/calcite

calcite介绍的更多相关文章

  1. Apache顶级项目 Calcite使用介绍

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

  2. Phoenix核心功能原理及应用场景介绍以及Calcite 查询计划生成框架介绍

    Phoenix是一个开源的HBase SQL层.它不仅可以使用标准的JDBC API替代HBase Client API创建表,插入和查询HBase,也支持二级索引.事物以及多种SQL层优化. 此系列 ...

  3. 【转】Kylin介绍 (很有用)

    转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...

  4. OLAP引擎——Kylin介绍(很有用)

    转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...

  5. Kylin介绍

    转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...

  6. 转: OLAP引擎——Kylin介绍

    本文转自:http://blog.csdn.net/yu616568/article/details/48103415 ,如有侵犯,立刻删除.  Kylin是ebay开发的一套OLAP系统,与Mond ...

  7. Apache Calcite项目简介

    文章导读: 什么是Calcite? Calcite的主要功能? 如何快速使用Calcite? 什么是Calcite Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功 ...

  8. Kylin介绍 (很有用)

    转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...

  9. 春蔚专访--MaxCompute 与 Calcite 的技术和故事

    摘要:2019大数据技术公开课第一季<技术人生专访>,来自阿里云计算平台事业部高级开发工程师雷春蔚向大家讲述了MaxCompute 与 Calcite 的技术和故事. 具体内容包括: 1) ...

随机推荐

  1. 【BZOJ3518】点组计数 欧拉函数

    [BZOJ3518]点组计数 Description 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c ...

  2. Oracle入门笔记 ——启动进阶

    1.2 进阶内容: 两个概念:SCN 和 检查点  1.SCN的定义:     system change member ,系统改变号,是数据库中非常重要的一个数据结构.     SCN 用以标示数据 ...

  3. SVN 配置和使用

    SVN使用环境 使用SVN管理源代码,必须有2套环境 服务器 用来存储客户端上传的源码 一般都是在Windows环境下安装Visual SVN Server 客户端 用来提交.回退.修改.下载等操作 ...

  4. pandas的replace方法

    就是将一个值替换为另一个值,以前我用的是赋值方式,这里应该效率会高. 1.说明: 语法:replace(self, to_replace=None, value=None, inplace=False ...

  5. android 导出数据库文件

    1.打开dos窗口,进入自己SDK路径下,再进入platform-tools下边 2.进入shell模式: adb shell 3.获取所有root权限: su root 4.打开需要导出的数据库文件 ...

  6. python 定义类 学习1

    此时的d1就是类Dog的实例化对象 实例化,其实就是以Dog类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名 # 定义类模板 class dog(object): # 定义类的方法功能 # ...

  7. go-005-变量、常量

    概述 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 var 关 ...

  8. python3 捕捉代码行出错的小程序

    下面主要使用的是: try .. except .. else .. finally ...,用的是 traceback 这个第三方模块. import traceback #捕捉哪行代码报错 def ...

  9. cocos代码研究(8)持续动作子类学习笔记

    理论部分 时间间隔动作(ActionInterval)是一个在一段时间内执行的动作. 它有一个开始时间和完成时间.完成时间等于起始时间加上持续时间. ActionInterval的子类与位置有关的动作 ...

  10. 32Sql数据库的插入

    上一节讲了数据库的连接,本例直接将数据库的插入操作,重点还是QSqlQuery类 QSqlQuery query; //新建二维表 query.exec("CREATE TABLE stud ...