什么是Calcite

Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等,但是又省略了一些关键的功能,比如Calcite并不存储相关的元数据和基本数据,不完全包含相关处理数据的算法等。

也正是因为Calcite本身与数据存储和处理的逻辑无关,所以这让它成为与多个数据存储位置(数据源)和多种数据处理引擎之间进行调解的绝佳选择。

Calcite所做的工作就是将各种SQL语句解析成抽象语法树(AST Abstract Syntax Tree),并根据一定的规则或成本对AST的算法与关系进行优化,最后推给各个数据处理引擎进行执行。

目前,使用Calcite作为SQL解析与优化引擎的又Hive、Drill、Flink、Phoenix和Storm,Calcite凭借其优秀的解析优化能力,会有越来越多的数据处理引擎采用Calcite作为SQL解析工具。

Calcite 主要功能

Calcite的主要功能我们上面其实已经提到了,主要有以下功能:

SQL解析:通过JavaCC将SQL解析成未经校验的AST语法树

SQL校验:校验分两部分,一种为无状态的校验,即验证SQL语句是否符合规范;一种为有状态的即通过与元数据结合验证SQL中的Schema、Field、Function是否存在。

SQL查询优化:对上个步骤的输出(RelNode)进行优化,得到优化后的物理执行计划

SQL生成:将物理执行计划生成为在特定平台/引擎的可执行程序,如生成符合Mysql or Oracle等不同平台规则的SQL查询语句等

数据连接与执行:通过各个执行平台执行查询,得到输出结果。

所以在Calcite中,一条SQL的处理步骤就很清晰了,那么我们通过Calcite的代码来实际了解一下:

// 初始化配置

SqlParser.ConfigBuilder configBuilder = SqlParser.configBuilder();

configBuilder.setUnquotedCasing(Casing.UNCHANGED);

//Sql解析:解析Sql语句,通过JavaCC解析成AST语法树,表现为SqlNode

SqlParser sqlParser = SqlParser.create(sql, configBuilder.build());

SqlNode sqlNode = sqlParser.parseQuery();

//Sql校验:结合元数据信息验证Sql是否符合规范

Planner planner = Frameworks.getPlanner(config);

SqlNode node = planner.validate(sqlNode);

//Sql查询优化:将SqlNode转换为LogicalPlan,表现为RelNode

RelRoot relRoot = planner.rel(node);

RelNode project = relRoot.project();

//指定优化规则

final HepProgram program = new HepProgramBuilder()

.addRuleInstance(SubQueryRemoveRule.PROJECT)

.addRuleInstance(SubQueryRemoveRule.FILTER)

.addRuleInstance(SubQueryRemoveRule.JOIN)

.build();

//生成优化后的RelNode

HepPlanner prePlanner = new HepPlanner(program);

prePlanner.setRoot(project);

RelNode relNode = prePlanner.findBestExp();

//ToDo 执行查询

使用Calcite

那么前面对Calcite进行了简单的介绍,我们如何使用Calcite呢?Calcite的使用非常简单,你要做的只是添加数据源即可。我们以Mysql数据源为例,我们通过添加Mysql数据库作为Calcite的数据源,实现通过Calcite对Mysql数据进行查询的Demo。

//创建Calcite Connection对象

Class.forName("org.apache.calcite.jdbc.Driver");

Properties info = new Properties();

info.setProperty("lex", "JAVA");

Connection connection =

DriverManager.getConnection("jdbc:calcite:", info);

CalciteConnection calciteConnection =

connection.unwrap(CalciteConnection.class);

SchemaPlus rootSchema = calciteConnection.getRootSchema();

//创建Mysql的数据源schema

Class.forName("com.mysql.jdbc.Driver");

BasicDataSource dataSource = new BasicDataSource();

dataSource.setUrl("jdbc:mysql://localhost");

dataSource.setUsername("username");

dataSource.setPassword("password");

Schema schema = JdbcSchema.create(rootSchema, "hr", dataSource,

null, "name");

rootSchema.add("hr", schema);

//执行查询

Statement statement = calciteConnection.createStatement();

ResultSet resultSet = statement.executeQuery(

"select d.deptno, min(e.empid)\n"

+ "from hr.emps as e\n"

+ "join hr.depts as d\n"

+ " on e.deptno = d.deptno\n"

+ "group by d.deptno\n"

+ "having count(*) > 1");

print(resultSet);

resultSet.close();

statement.close();

connection.close();

Calcite提供了多种方式添加数据源,如通过“inline:”的字符串方式以及通过json或yaml文件的方式。同时,Calcite抽象出了功能齐全的接口,可以方便的将CSV文件抽象成数据表进行查询。这部分内容可以通过官方的示例了解一下!

当然SQL解析、校验与执行计划优化是Calcite的基本功能,Calcite的NB之处在于,Calcite的目标是“one size fits all”,希望能为不同的计算平台和数据源提供统一的查询引擎,并且以类似传统数据库的访问方式(SQL)来访问Hadoop上的数据。所以Calcite提供了非常丰富的可扩展接口,帮助我们实现扩展数据源、扩展针对不同数据源的优化规则、扩展SQL查询语法、扩展数据处理引擎等等。这部分后面会详细介绍(挖坑ing)

参考资料:

··························

欢迎关注课程:

HBase+SpringBoot实战分布式文件存储

calcite mysql_Apache顶级项目 Calcite使用介绍相关推荐

  1. calcite mysql_Apache Calcite 简介

    不想看文章直接访问mysql-protocal(Java版本的Mysql).calcite-test ,这里有关于Calcite RBO,CBO使用具体用例 1. 什么是Apache Calcite ...

  2. Apache 基金会宣布 Apache Kylin 成为顶级项目

    Apache软件基金会宣布Apache Kylin成为顶级项目 Apache Kylin是可扩展到PB规模的开源分布式大数据分析引擎,已被应用在eBay,Exponential, 京东,美团,明略数据 ...

  3. 我给 Apache 顶级项目提了个 Bug

    作者 | 骆俊武 来源 | IT人的职场进阶(ID:BestITer) 这篇文章记录了给 Apache 顶级项目 - 分库分表中间件 ShardingSphere 提交 Bug 的历程. 说实话,这是 ...

  4. RocketMQ Apache顶级项目之路

    序言 \\ 2016年11月,阿里将RocketMQ捐献给Apache软件基金会,正式成为孵化项目.至此,RocketMQ 开启了迈向全球顶级开源软件的新征程.通过社区半年多的努力.9 月 25 日, ...

  5. 国人主导研发的 HAWQ® 成 Apache® 顶级项目

    百度智能云 云生态狂欢季 热门云产品1折起>>>   北京时间8月22日,在美国马萨诸塞州的韦克菲尔德,全球著名软件基金会 Apache® 正式宣布: Apache® HAWQ® 毕 ...

  6. 这么多Apache顶级项目,SkyWalking为何一枝独秀?

    吴晟 读完需要 5 分钟 速读仅需 2 分钟 吴晟 Apache基金会会员,Apache SkyWalking创始人.项目VP和PMC成员,Apache孵化器PMC成员,Apache Sharding ...

  7. 我给Apache顶级项目提了个Bug

    这篇文章记录了给 Apache 顶级项目 - 分库分表中间件 ShardingSphere 提交 Bug 的历程. 说实话,这是一次比较曲折的 Bug 跟踪之旅.10月28日,我们在 GitHub 上 ...

  8. 剖析 Apache 顶级项目 SkyWalking 的源码 ,看看它有什么好?

    最近十年间,大数据的飞速发展,云计算.IoT 以及工业 4.0 的百花齐放,让互联网产品的竞争越演愈烈,业务架构更是变得更加复杂,对运维人员和开发人员来说,压力日渐剧增. 以前,我们用 APM 主要监 ...

  9. 第一个国产Apache 顶级项目 Kylin,了解一下!| 原力计划

    作者 | Alice菌 来源 | CSDN博客,责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 说到Apache顶级开源项目,大家首先会想到什么??? 不熟悉Apache软件基金会的朋友 ...

最新文章

  1. 网络广告推广浅析网站的外链究竟要如何优化效果才会更好呢?
  2. DBCC CHECKIDENT
  3. Roller5.0.3安装配置部署 step by step
  4. leetcode647 回文子串
  5. 树形列(无限级联下拉列的曲线版本)
  6. 【codevs3110】一把鼻涕一把泪的堆排序
  7. oracle使用表空间语句,oracle表空间语句
  8. 监督分类空白处也被分类了_如何兼容自训练与预训练:更高效的半监督文本分类模型...
  9. JDE 系统表(标准表)
  10. 丢机者要哭:苹果移除了 iCloud 激活锁状态查询页面
  11. 转:Windows 7 SP1 RC 开始推送 ┆ 特殊补丁KB976932 ┆ 下载
  12. java之成员变量(实例成员变量和静态成员变量)
  13. addClass()方法
  14. Java实现身份证号合法性校验(包含港澳台地区)
  15. python之路day3_python之路:day3
  16. 利用二进制变量相或,得出唯一整形变量,以表示某事物的叠加态
  17. Ardupilot基于UWB的定位飞行测试
  18. 研究生小论文的投稿技巧
  19. 数据库表设计3:微信、QQ第三方多账号登陆
  20. 独立开发变现周刊(第75期):我的SaaS模板代码库每月赚4千美元

热门文章

  1. php 管理服务器内存,解决PHP-FPM进程导致的服务器内存占用
  2. 软件工程白盒测试的流图怎么画_功能安全理论 | 黑盒 与 白盒
  3. 聚合函数的计算机控件,使用Kendo UI MVC Grid包装器的聚合函数
  4. java getname file_Java File getName()方法
  5. 硬中断 / 软中断的原理和实现
  6. python中gui有没有电子表格控件_python实现表格控件
  7. 我们自嘲的“码农”身份被官方实锤了!
  8. Spring Boot 中关于 %2e 的 Trick
  9. 一项无聊的研究与论文,导致整个大学被Linux封杀!
  10. 经典游戏大合集,你的青春也许就在里面!