初识Calcite——使用实例
Calcite(https://calcite.apache.org/)是Apache的一个孵化器项目,它是一个构建JDBC或者ODBC访问数据库的框架,通过自定义一些adapter通过sql访问任意类型的数据,回想起我们之前使用SQL的场景只有使用访问关系数据库如MYSQL、ORACLE等,通过hive查询HDFS上的数据,但是如果我们希望通过SQL接口访问内存中的某个数据结构(首先这个结构有关系模型)、文件里面的内容(例如CSV文件、有一定结构的普通文件,其实这些可以通过hive访问)、访问hbase和一些NOSQL数据库,甚至想要跨数据源访问(hive里面的数据和mysql里面的数据进行join查询)。以上基本上代表了我们平时接触到的各种各样的数据存储的位置,而Calcite要解决的问题就是让你想办法将这些数据建立一个关系模型,然后通过SQL查询这些数据。
假设我们只使用calcite做查询,因为以上的数据基本上都是通过其他方式写入的数据,而我们需要的是通SQL查询,calcite实现了SQL语句的解析,生成物理执行计划以及查询计划的优化,用户需要向Calcite提供数据库的元数据(有哪些database(schema),每一个数据库下有哪些table,每一个表有哪些字段,每一个字段的类型是什么)和数据(每一个表中的每一行数据是什么)。除此之外,用户也可以重载它提供的执行计划,这里只是提及到了Calcite的一些基本功能,高阶功能诸如Streaming(流式查询)、Lattices(物化视图)等,目前使用Calcite的方式是作为一个本地的框架工具而非作为一个服务存在。
Apache Calcite具有以下几个技术特性:
支持标准SQL语言;
独立于编程语言和数据源,可以支持不同的前端和后端;
支持关系代数、可定制的逻辑规划规则和基于成本模型优化的查询引擎;
支持物化视图(materialized view)的管理(创建、丢弃、持久化和自动识别);
基于物化视图的Lattice和Tile机制,以应用于OLAP分析;
支持对流数据的查询。
这里有一篇介绍Calcite的文章可以参考:http://www.infoq.com/cn/articles/new-big-data-hadoop-query-engine-apache-calcite
- public static final Map<String, Database> MAP = new HashMap<String, Database>();
- public static class Database {
- public List<Table> tables = new LinkedList<Table>();
- }
- public static class Table{
- public String tableName;
- public List<Column> columns = new LinkedList<Column>();
- public List<List<String>> data = new LinkedList<List<String>>();
- }
- public static class Column{
- public String name;
- public String type;
- }
- cl. tableName = "Class";
- Column name = new Column();
- name.name = "name";
- name.type = "varchar";
- cl.columns.add(name);
- Column id = new Column();
- id.name = "id";
- id.type = "integer";
- cl.columns.add(id);
- Column teacher = new Column();
- teacher.name = "teacher";
- teacher.type = "varchar";
- cl.columns.add(teacher);
- student. tableName = "Student";
- Column name = new Column();
- name.name = "name";
- name.type = "varchar";
- student.columns.add(name);
- Column id = new Column();
- id.name = "id";
- id.type = "varchar";
- student.columns.add(id);
- Column classId = new Column();
- classId.name = "classId";
- classId.type = "integer";
- student.columns.add(classId);
- Column birth = new Column();
- birth.name = "birthday";
- birth.type = "date";
- student.columns.add(birth);
- Column home = new Column();
- home.name = "home";
- home.type = "varchar";
- student.columns.add(home);
- {
- version: '1.0',
- defaultSchema: 'school',
- schemas: [
- {
- name: 'school',
- type: 'custom',
- factory: 'org.apache.kylin.calcite.test.MemorySchemaFactory',
- operand: {
- param1: 'hello',
- param2: 'world';
- }
- }
- ]
- }
- public class MemorySchemaFactory implements SchemaFactory{
- @Override
- public Schema create(SchemaPlus parentSchema, String name, Map<String, Object> operand) {
- System. out.println( "param1 : " + operand.get( "param1"));
- System. out.println( "param2 : " + operand.get( "param2"));
- System. out.println( "Get database " + name);
- return new MemorySchema( name);
- }
- }
- @Override
- public Map<String, Table> getTableMap() {
- Map<String, Table> tables = new HashMap<String, Table>();
- Database database = MemoryData. MAP.get( this. dbName);
- if(database == null)
- return tables;
- for(MemoryData.Table table : database. tables) {
- tables.put( table. tableName, new MemoryTable( table));
- }
- return tables;
- }
- @Override
- public RelDataType getRowType(RelDataTypeFactory typeFactory) {
- if(dataType == null) {
- RelDataTypeFactory.FieldInfoBuilder fieldInfo = typeFactory.builder();
- for (MemoryData.Column column : this. sourceTable. columns) {
- RelDataType sqlType = typeFactory.createSqlType(
- MemoryData.SQLTYPE_MAPPING.get(column .type ));
- sqlType = SqlTypeUtil.addCharsetAndCollation(sqlType, typeFactory);
- fieldInfo.add( column. name, sqlType);
- }
- this. dataType = typeFactory.createStructType( fieldInfo);
- }
- return this.dataType;
- }
- @Override
- public Enumerable<Object[]> scan(DataContext root) {
- final int[] fields = identityList(this.dataType.getFieldCount());
- return new AbstractEnumerable<Object[]>() {
- public Enumerator<Object[]> enumerator() {
- return new MemoryEnumerator<Object[]>( fields, sourceTable. data);
- }
- };
- }
- public static void main(String[] args) {
- try {
- Class. forName("org.apache.calcite.jdbc.Driver");
- } catch (ClassNotFoundException e1) {
- e1.printStackTrace();
- }
- Properties info = new Properties();
- try {
- Connection connection =
- DriverManager.getConnection("jdbc:calcite:model=E:\\file\\to\\model\\file\\School.json", info );
- ResultSet result = connection.getMetaData().getTables( null, null, null, null);
- while( result.next()) {
- System. out.println( "Catalog : " + result.getString(1) + ",Database : " + result.getString(2) + ",Table : " + result .getString(3));
- }
- result.close();
- Statement st = connection.createStatement();
- result = st.executeQuery( "select \"home\", 1 , count(1) from \"Student\" as S INNER JOIN \"Class\" as C on S.\"classId\" = C.\"id\" group by \"home\"");
- while( result.next()) {
- System. out.println( result.getString(1) + "\t" + result.getString(2) + "\t" + result.getString(3));
- }
- result.close();
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- param1 : hello
- param2 : world
- Get database school
- Catalog : null,Database : metadata,Table : COLUMNS
- Catalog : null,Database : metadata,Table : TABLES
- Catalog : null,Database : school,Table : Class
- Catalog : null,Database : school,Table : Student
- sichuan 1 1
- zhejiang 1 1
- henan 1 1
- jiangsu 1 1
- hebei 1 1
- beijing 1 1
- anhui 1 2
初识Calcite——使用实例相关推荐
- SpringMVC 框架系列之初识与入门实例
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1).什么是 MVC:Model-View-Control Co ...
- log4j 源码解析_log4j2源码解析(2)--LoggerContext
LoggerContext作用及初始化流程 根据我们在Log4j初识中的实例可以看出,在不适用日志门面插件slf4j的情况下,获取logger的方式一般为 Logger logger = logMan ...
- SpringMVC 框架系列之组件概述与配置详解
在上一篇文章 SpringMVC 框架系列之初识与入门实例 的实例中,我们已经知道,SpringMVC 框架是一个 web 层的框架,本篇文章就详细解释一下 SpringMVC 框架具体文件的配置以及 ...
- java w3c dom api_org.w3c.dom 中文api
关于XML字符串和XML Document之间的转换 在web项目中,XML作为一种重要的数据存储和传输介质,被广泛使用.XML文件,XML字符串和XML Document对象是XML存在的三种形式, ...
- 精通Flash 8中文版视频教程
本书全面.系统.深入地介绍用flash制作动画的思路.方法和技巧,并对制作动画时经常会遇到的问题进行专家级的指导,对多年积累的实际制作经验进行了归纳总结,以帮助读者少走弯路,更顺利地掌握flash动画 ...
- python猜谜语小游戏代码_树莓派趣学实战100例--网络应用+Python编程+传感器+服务器搭建...
导语 内容提要 本书是面向第4代树莓派(Raspberry Pi4B)的全新实战指南.树莓派(Raspberry Pi)是一款价格低廉.只有一张信用卡大小的计算机.然而麻雀虽小,却五脏俱全,树莓派是一 ...
- c++语言经典编程282例,《C语言经典编程282例(C语言学习路线图)》怎么样_目录_pdf在线阅读 - 课课家教育...
第1章 初识C语言 实例001 第一个c语言程序 实例002 一个完整的c语言程序 实例003 输出名言 实例004 用tc 2.0打开文件 实例005 计算正方形的周长 第2章 简单的c程序 实例0 ...
- TensorFlow张量
TensorFlow简介: 官网上对TensorFlow的介绍是,一个使用数据流图(data flow graphs)技术来进行数值计算的开源软件库.数据流图中的节点,代表数值运算:节点节点之间的边, ...
- c语言经典编程282例有用吗,C语言经典编程282例
内容简介 前言 第1章 初识C语言 实例001 第一个C语言程序 实例002 一个完整的C语言程序 实例003 输出名言 实例004 用TC 2.0打开文件 实例005 计算正方形的周长 第2章 简单 ...
最新文章
- 使用pip将Python包安装到不同的目录中?
- java ee s2sh复习题_JavaEESSH框架答案试题题目及答案,期末考试题库,章节测验答案...
- 作为SEO老人不轻易建议客户进行动态网页优化设置
- 【Android 逆向】ELF 文件格式 ( ELF 文件简介 | ELF 文件结构 )
- Computing--状态机
- ICCV 2017 UCT:《UCT: Learning Unified Convolutional Networks forReal-time Visual Tracking》论文笔记
- Going to 的将来时态_47
- 【J2me3D系列学习文章之三】(立即模式)对立方体进行变换操作-旋转、缩放、平移...
- 乌龟git安装和使用
- 检测屏幕颜色显示坏点的一个小方法。
- oracle自我评价简历,程序员简历自我评价
- 学习c语言有什么作用,c语言有什么用 小白如何学习c语言
- HCSE5.0中文胶片
- java mvc demo_SpringMvcDemo 一个简单的 mvc 的 实现例子 Java Develop 259万源代码下载- www.pudn.com...
- iDev苹果开发者大会出品人-唐巧专访:用 HTML5 写移动应用终究不会成为主流
- 【Python】数据可视化基本套路总结
- 首席新媒体运营黎想教程:可复用的社群运营+直播流程
- ARFoundation之路-环境配置(iOS)之二
- Single Image Dehazing via Multi-scale Convolutional Neural Networks with Holistic Edges 2020 个人学习笔记
- python+selenium实现UI自动化(一)
热门文章
- 基带混用导致信号弱?iPhone网络差的原因及修复,望周知
- iOS开发学习笔记-C语言学习(一)
- adb发送什么命令能在手机屏幕弹窗显示_将平板、手机作为电脑第二屏幕(Linux系统下)...
- 推荐四个在线任务管理网站
- 关于IE、Firefox、Opera页面呈现异同 (转于纯蓝)
- 山西师范大学数学与计算机学院宿舍,数计学院宿舍文化节之PPT展示大赛决赛圆满结束...
- 帮我写一篇向女孩子表白的情书
- macOS Xcode8安装RVM,安装Ruby,安装/卸载Cococapods全程详解
- hive改表结构的两个坑
- 经典逻辑题:猜牌问题——网上的结论是没问题的