使用Apache Calcite解析数据库查询
Knoldus Inc.
3分钟阅读
嘿那里,作为一个技术人员有时我们必须编写数据库的查询,看起来不错,但我们不知道我们写的查询是句法正确的。所以在这个博客中,我们在Apache Calcite的帮助下使用测试用例来解决数据库查询并测试它。所以任何时候都不会浪费,让我们讨论Apache Calcite以及如何使用它来解析数据库查询。
介绍
Apache Calcite是一个动态数据管理框架。它甚至包含许多组成典型数据库管理系统的部分。但是它省略了一些关键功能:数据存储,处理数据的算法以及用于存储元数据的存储库。
什么是Apache Calcite?
- SQL解析器
- SQL验证
- 查询优化器
- SQL生成器
您应该了解有关Apache Calcite的一些导入事项
- Calcite不会存储和处理数据。
- 这是在应用程序之间以及一个或多个数据存储位置和数据处理引擎之间进行中介的绝佳选择。
- 它也是构建数据库的理想基础:只需添加数据。
- Calcite不想拥有数据;它甚至没有喜欢的数据格式。本示例使用内存中的数据集,并使用诸如groupBy之类的运算符对其进行处理,并从linq4j库中进行联接。
- 它还可以处理其他数据格式的数据,例如JDBC。
- Calcite使用优化器规则将JOIN和GROUP BY操作推入源数据库。
使用Calcite的优势:
以下功能已完成。
- 查询解析器,验证器和优化器。
- 支持以JSON格式读取模型。
- 许多标准函数和聚合函数。
- 针对Linq4j和JDBC后端的JDBC查询。
- Linq4j前端。
- SQL功能:SELECT,FROM(包括JOIN语法),WHERE,GROUP BY(包括GROUPING SETS),聚合函数(包括COUNT(DISTINCT…)和FILTER),HAVING,ORDER BY(包括NULLS FIRST / LAST),设置操作(UNION,INTERSECT,MINUS),子查询(包括相关的子查询),窗口聚合,LIMIT(语法为Postgres);SQL参考中的更多详细信息
- 本地和远程JDBC驱动程序;参见Avatica。
- 几个适配器。
查询执行阶段

Calcite的成分
目录-定义可在SQL查询中访问的元数据和命名空间SQL解析器-将有效的SQL查询解析为抽象语法树(AST)。SQL验证程序-根据catalog提供的元数据验证抽象语法树查询优化器-将AST转换为逻辑计划,进行优化逻辑计划,并将逻辑表达式转换为物理计划SQL生成器—将物理计划转换为SQL
Calcite目录的用法
定义可在Calcite查询中访问的名称空间。

查询优化
- 修剪未使用的字段
- 合并预测
- 将子查询转换为联接
- 重新排序加入
- 下推投影
- 下推过滤器
使用Apache Calcite的项目
- Hive
- Drill
- Flink
- Phoniex
- Samza
- Storm
现在介绍如何使用Apache Calcite解析SQL查询。
1:将此插件添加到数据库查询的依赖项或模块中。
"org.apache.calcite" % "calcite-babel" % "1.21.0"
2:创建将查询作为输入的方法,返回SqlNode。在这种方法中,您必须提供如下配置:您可以选择自己的分析器工厂)
val sqlParserConfig = CalciteParser
.configBuilder()
.setParserFactory(SqlBabelParserImpl.FACTORY)
.setConformance(SqlConformanceEnum.BABEL)
.build()
3:通过上面的配置(我以BABEL为例,您可以选择自己的解析器工厂)
CalciteParser.create(sql, sqlParserConfig).parseQuery()
4: 现在,在测试案例中,只需声明您的数据库查询或方法即可返回
assert(parseSql(resultedSql).isInstanceOf[SqlNode])
在其中parseSql是实际解析查询的方法。
概述
建立SQL数据库的框架。它已经发展了十多年。用Java编写,以前称为Optimiser。也称为Farrago。在2013年成为Apache项目。由Hortonworks的Julian Hyde领导。
(本文由闻数起舞翻译自Knoldus Inc.的文章《Parsing database Query with Apache Calcite》,转载请注明出处,原文链接:https://medium.com/@knoldus/parsing-database-query-with-apache-calcite-8d1567de3ffa)