当前位置:首页 > Web开发 > 正文

Apache Calcite 学习 (一)

11-05 Web开发

关于 Apache Calcite 的简单介绍可以参考 Apache Calcite:Hadoop 中新型大数据查询引擎 这篇文章,Calcite 一开始设计的目标就是 one size fits all,它希望能为不同计算存储引擎提供统一的 SQL 查询引擎,当然 Calcite 并不仅仅是一个简单的 SQL 查询引擎,在论文 Apache Calcite: A Foundational Framework for Optimized Query Processing Over Heterogeneous Data Sources 的摘要(摘要见下面)部分,关于 Calcite 的核心点有简单的介绍,Calcite 的架构有三个特点:flexible, embeddable, and extensible,就是灵活性、组件可插拔、可扩展,它的 SQL Parser 层、Optimizer 层等都可以单独使用,这也是 Calcite 受总多开源框架欢迎的原因之一。

Apache Calcite is a foundational software framework that provides query processing, optimization, and query language support to many popular open-source data processing systems such as Apache Hive, Apache Storm, Apache Flink, Druid, and MapD. Calcite’s architecture consists of

a modular and extensible query optimizer with hundreds of built-in optimization rules,

a query processor capable of processing a variety of query languages,

an adapter architecture designed for extensibility,

and support for heterogeneous data models and stores (relational, semi-structured, streaming, and geospatial).
This flexible, embeddable, and extensible architecture is what makes Calcite an attractive choice for adoption in bigdata frameworks. It is an active project that continues to introduce support for the new types of data sources, query languages, and approaches to query processing and optimization.

Calcite 概念

在介绍 Calcite 架构之前,先来看下与 Calcite 相关的基础性内容。

关系代数的基本知识

关系代数是关系型数据库操作的理论基础,关系代数支持并、差、笛卡尔积、投影和选择等基本运算。关系代数也是 Calcite 的核心,任何一个查询都可以表示成由关系运算符组成的树。在 Calcite 中,它会先将 SQL 转换成关系表达式(relational expression),然后通过规则匹配(rules match)进行相应的优化,优化会有一个成本(cost)模型为参考。

这里先看下关系代数相关内容,这对于理解 Calcite 很有帮助,特别是 Calcite Optimizer 这块的内容,关系代数的基础可以参考这篇文章SQL 形式化语言——关系代数,简单总结如下:

名称英文符号说明
选择   select   σ   类似于 SQL 中的 where  
投影   project   Π   类似于 SQL 中的 select  
  union     类似于 SQL 中的 union  
集合差   set-difference   -   SQL中没有对应的操作符  
笛卡儿积   Cartesian-product   ×   类似于 SQL 中不带 on 条件的 inner join  
重命名   rename   ρ   类似于 SQL 中的 as  
集合交   intersection     SQL中没有对应的操作符  
自然连接   natural join   ?   类似于 SQL 中的 inner join  
赋值   assignment    
查询优化

查询优化主要是围绕着 等价交换 的原则做相应的转换,这部分可以参考【《数据库系统概念(中文第六版)》第13章——查询优化】,关于查询优化理论知识,这里就不再详述,列出一些个人不错不错的博客,大家可以参考一下:

数据库查询优化入门: 代数与物理优化基础;

高级数据库十五:查询优化器(一);

高级数据库十六:查询优化器(二);

「 数据库原理 」查询优化(关系代数表达式优化);

4.1.3 关系数据库系统的查询优化(1);

4.1.3 关系数据库系统的查询优化(10);

Calcite 中的一些概念

Calcite 抛出的概念非常多,笔者最开始在看代码时就被这些概念绕得云里雾里,这时候先从代码的细节里跳出来,先把这些概念理清楚、归归类后再去看代码,思路就清晰很多,因此,在介绍 Calcite 整体实现前,先把这些概念梳理一下,需要对这些概念有个基本的理解,相关的概念如下图所示:

技术图片

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/web/10069.html