Kylin 源码阅读笔记

简介: JDBC 入口开始分析jdbc 数据查询接口依次按如下步骤完成 kylin 的查询内容(这里省略了函数实现内容,以减少篇幅):1. KylinClient.

JDBC 入口开始分析

jdbc 数据查询接口依次按如下步骤完成 kylin 的查询内容(这里省略了函数实现内容,以减少篇幅):

1. KylinClient.executeQuery()             --- 从这里开始是在 jdbc 包中
2. KylinClient.executeKylinQuery()
3. QueryController.query()                --- 从这里开始是在 server-base 包中
4. QueryService.doQueryWithCache()
5. QueryService.queryAndUpdateCache()
6. QueryService.query()
7. QueryService.queryWithSqlMassage()
8. QueryService.executeRequest()
9. QueryConnection.getConnection().executeQuery()

查询引擎分析

进入到 QueryConnection 中时,其实已经进入到了 kylin-query 模块(kylin query engine based on Calcite), 其主要是以 Calcite 为基础,自定义SchemaFactory来定义 Schema, 及表结构,如下先简单介绍 Calcite 实现 SQL 查询引擎的基础流程:

1. 通过实现SchemaFactory接口的插件类, 执行create方法, 完成schema的实例化 
   - 具体的插件类在schema文件中的factory字段指定了
   - create方法中的参数通过schema文件中的operand字段指定
   - create方法会实例化一个具体的实现了Schema接口的Schema类(用户自己的Schema类)
2. 一个Schema类的作用在于管理和自己相关的表和函数 
   - 用户自定义的Schema类Override了Map<String, Table> getTableMap()方法
3. Schema类产生的表均实现了Calcite的Table接口 
   - 官方提供的几种实现该Table接口的抽象类,用户可以继承
   - 用户的每一种Table类均可以给出自己的数据读写方法
4. Calcite supports query optimization by adding planner rules.
5. Table scans are the leaves of a query operator tree. The usual implementation is `EnumerableTableScan`
6. 用户自己实现的`TableScan`类中会注册用户自行添加的规则Rule类
7. 用户自己实现的`TableScanRule`类(需要继承`RelOptRule`抽象类)负责具体的实现

因此,在 kylin 中主要是在 OLAPSchemaFactory 类中完成 OLAPSchema 实例化,然后在 OLAPSchema 中对 OLAPTable 进行实例化。

1. OLAPSchema        ---- 元数据
2. OLAPTable         ---- 基础表
3. OLAPTableScan     ---- 自定义的查询规则

其中 OLAPQuery 中定义了 四 种不同类型的查询方式。

通过上述内容可得,kylin 系统中的查询过程通过对 Calcite 的自定义查询规则的方式来加速查询过程,对关键的查询语句进行缓存,从而达到快速查询的过程。

目录
相关文章
|
Ubuntu Docker Python
Ubuntu虚拟机部署rtmp服务器实现视频推拉流
本教程实现在Ubuntu上部署rtmp服务器并在Windows上用脚本推流到rtmp服务器。
904 0
Ubuntu虚拟机部署rtmp服务器实现视频推拉流
|
12月前
|
机器学习/深度学习 算法 搜索推荐
利用深度学习实现图像风格迁移
【9月更文挑战第21天】本文将介绍一种使用深度学习技术,特别是卷积神经网络(CNN)和生成对抗网络(GAN)来实现图像风格迁移的方法。我们将探索如何将这些技术应用于艺术创作,以及它们如何影响现代视觉艺术的发展。
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
754 0
|
SQL 安全 流计算
Flink SQL 在快手实践问题之Group Window Aggregate 中的数据倾斜问题如何解决
Flink SQL 在快手实践问题之Group Window Aggregate 中的数据倾斜问题如何解决
166 1
|
11月前
|
程序员 开发工具 git
腾讯自研Git客户端,助力每个人都可以轻松使用Git
腾讯自研Git客户端,助力每个人都可以轻松使用Git
212 0
|
SQL 存储 NoSQL
数据库技术详解:从基础到进阶,掌握数据处理的核心
一、引言 在数字化时代,数据已成为企业的核心资产
|
监控 小程序 前端开发
C#医院预约挂号小程序源码(前端+后台)
线上预约挂号系统构建了医院和患者的连接,通过改善患者院内的就医服务流程,以微信公众号、支付宝小程序为患者服务入口,为居民提供导诊、预约、支付、报告查询等线上线下一体化的就医服务,缩短患者就诊环节,提高医疗机构服务效率。
320 0
|
SQL 分布式计算 算法
手撕SparkSQL五大JOIN的底层机制
手撕SparkSQL五大JOIN的底层机制
437 0
|
前端开发 JavaScript Java
Java 获取远程excel内容-修改excel内容
讲述Java获取远程excel内容,并修改excel中指定列内容并返回新的excel
|
关系型数据库 MySQL 索引
Elasticsearch 设置默认值的三种方式
1、实战问题 在使用 Elasticsearch 过程中,不免还会有 Mysql 等关系型数据库的使用痕迹,以下两个都是实战开发问到的问题: Elasticsearch 新增字段,能在 Mapping 设置默认值吗? Elasticsearch 有什么好的方式维护文档的 create_time (创建时间)和 update_time (更新时间)吗? 本文就从 Elasticsearch 默认值的实现方案说开去。
Elasticsearch 设置默认值的三种方式