网站首页 > 教程分享 正文
calcite是一个动态数据管理框架,它提供了SQL解析与校验,SQL优化,jdbc接口等能力,并且能够支持对不同数据源的适配以及对SQL语法的扩展等,目前被广泛用于Spark, Flink等大数据引擎中。
基础对象和接口
Calcite是一个动态数据管理框架,它提供了sql解析以及jdbc接口,我们可以使用calcite做sql解析或者利用calcite适配器实现通过sql访问任意类型的存储
calcite中的关键接口介绍:
· Table接口:对某种类型的表的抽象,比如calcite内置的JdbcTable表示关系型数据库中的表
· QueryableTable接口:表示可查询的表,表示可以在这类表上执行select语句
· FilterableTable接口:可过滤的表,该接口摘借一个scan方法,calcite实现了对sql中的where条件的过滤,对于一些存储的实现,如果将所有数据查询出来后再过滤往往是行不通的,通过实现此接口,将过滤条件转换成存储的过滤api,先在查询时通过数据源做过滤
· ModifiableTable接口:表示 可修改的表,如果想要对表实现insert, update, delete,则需要实现此接口
· RelNode接口:关系表达式,SQL解析后的对象由关系表达式组成,是一个表达式树
· RelOptRule抽象类:calcite在做SQL优化时使用的转换表达式的规则,比如将RelNode转换成存储系统的查询api的调用
· Schema接口:对表的命名空间的抽象,对应于mysql中的database,一个表必须属于一个schema
实现适配器
实现适配器需要做两件事:
· 定义schema并实现Table,表示某种类型的表
· 实现SQL到查询/更新的转换
· 如果只需要支持查询,则可以实现QueryableTable,如果需要支持通过数据源做条件过滤,则可实现FilterableTable接口
· 如果需要支持update/insert/delete语句,则需要实现ModifiableTable接口
自定义adapter通过SQL调用http接口
代码地址:
首先实现Table:
ObjectTable是一个从AbstractQueryableTable继承的抽象类,其中封装了对字段类型的处理,代码如下:
HttpTable是一个FilterableTable,其scan方法提供了对查询的实现,其逻辑非常简单,拿到可以用于下沉到数据源的过滤参数,并通过过滤参数调用invoker获取scan的结果,calcite会基于此结果对数据再次做过滤,执行不能下沉到数据源的过滤条件得到最终的结果。invoker对象是一个Function,用于提供select语义的支持,通过构造器传入。
接下来定义Schema,可以从AbstractSchema继承:
接下来实现一个工厂,用于创建HttpApiSchema:
tableDefParser的作用是解析operand这个map中的kv,并生成HttpTable对象,而operand则是从json配置中来,json配置中定义schema的基础信息和每个table的基础信息,其中的operand字段的值则是自定义的内容,可自行解析(与上面的tableDefParser的逻辑一致):
最后实现查询逻辑,即invoker那个Function的实现,期核心代码如下:
致此,通过sql的select调用http接口的实现完成,通过jdbc接口使用方式如下:
LogicTableExecutor实现如下:
- 上一篇: 10条干邑知识,让你分分钟拥有品酒师范儿
- 下一篇: 精致的温馨(温馨的经典语录)
猜你喜欢
- 2025-04-07 情人节,巧克力与红葡萄酒最浪漫!
- 2025-04-07 计算机专业的四大基础知识梳理(计算机专业分为哪四大类)
- 2025-04-07 教你读懂美国酒标术语背后的含义(美国酒品牌排行价格)
- 2025-04-07 终极吃货 连餐具也不放过!(终极吃货 连餐具也不放过)
- 2025-04-07 精致的温馨(温馨的经典语录)
- 2025-04-07 10条干邑知识,让你分分钟拥有品酒师范儿
- 2025-04-07 大牛巧用一文带你彻底搞懂解释器的内部构造和解释执行过程
- 2025-04-07 你没见过的分库分表原理解析和解决方案(二)
- 2025-04-07 「年薪30万跳槽神器」手撕Qt/C++百万级航空订票系统
- 2025-04-07 Java中JDK里用到了哪些设计模式?让面试官眼前一亮!
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)