前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache Calcite 文档翻译 - 背景概述

Apache Calcite 文档翻译 - 背景概述

作者头像
tyrantlucifer
发布2022-03-23 15:13:43
8030
发布2022-03-23 15:13:43
举报
文章被收录于专栏:Tyrant Lucifer

背景概述

Apache Calcite是一个动态数据管理框架。

它包含了构成典型数据库管理系统的许多部分,但是省略了一些关键性的功能:数据存储、处理数据的算法和一个用于存储元数据的元数据库。

Calcite有意不参与存储和处理数据的业务,正如我们将看到的,这个特性使得它成为在应用程序和一个或多个数据存储位置和数据处理引擎之间进行适配的绝佳选择。它也是建立数据库的一个完美的基础:只需要添加数据给它,它就可以成为你的最佳数据管理工具。

为了说明这一点,让我们创建一个空的Calcite的实例,然后添加一些数据给它:

代码语言:javascript
复制
public static class HrSchema {
  public final Employee[] emps = 0;
  public final Department[] depts = 0;
}
Class.forName("org.apache.calcite.jdbc.Driver");
Properties info = new Properties();
info.setProperty("lex", "JAVA");
Connection connection =
    DriverManager.getConnection("jdbc:calcite:", info);
CalciteConnection calciteConnection =
    connection.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
Schema schema = new ReflectiveSchema(new HrSchema());
rootSchema.add("hr", schema);
Statement statement = calciteConnection.createStatement();
ResultSet resultSet = statement.executeQuery(
    "select d.deptno, min(e.empid)\n"
    + "from hr.emps as e\n"
    + "join hr.depts as d\n"
    + "  on e.deptno = d.deptno\n"
    + "group by d.deptno\n"
    + "having count(*) > 1");
print(resultSet);
resultSet.close();
statement.close();
connection.close();

数据库在哪里?实际上并没有数据库存在,连接完全是空的,直到new ReflectiveSchema这个操作注册了一个Java对象作为数据库的schema(模式),其中对象中的集合字段empsdepts作为数据库中的table(表)。

Calcite并不想拥有数据,它甚至没有喜欢的数据格式。这个例子使用了内存中的数据集,并使用Linq4j库中的groupByjoin等运算符处理它们。但Calcite也可以处理其他格式的数据,例如JDBC,在第一个例子中,将以下代码

代码语言:javascript
复制
Schema schema = new ReflectiveSchema(new HrSchema());

使用

代码语言:javascript
复制
Class.forName("com.mysql.jdbc.Driver");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost");
dataSource.setUsername("username");
dataSource.setPassword("password");
Schema schema = JdbcSchema.create(rootSchema, "hr", dataSource,
    null, "name");

进行替换后,Calcite将在JDBC中执行相同的查询。对应用程序而言,数据和API是相同的,但是在其背后的实现却非常不同。Calcite使用优化器规则将JOINGROUP BY操作推送到源数据库。

内存和JDBC只是两个熟悉的例子。Calcite可以处理任何数据源和数据格式。要添加一个数据源,你需要写一个适配器(adapter),告诉Calcite在数据源中哪些集合应该被视为 "表"。

对于更高级的集成,你可以编写优化器规则。优化器规则允许Calcite访问新格式的数据,允许你注册新的运算符(比如更好的连接(join)算法),并允许Calcite优化查询如何转换为运算符。Calcite会将你的规则和运算符与内置的规则和运算符结合起来,应用基于成本的优化,并生成一个高效的执行计划。

写一个适配器

源代码example/csv下的子项目提供了一个CSV适配器,它功能齐全,可以在应用程序中直接使用,但如果你要编写自己的适配器,它也足够简单,可以作为一个很好的模板用来参考。

关于使用CSV适配器和编写其他适配器的信息,请参见该教程:https://calcite.apache.org/docs/tutorial.html

关于使用其他适配器的更多信息,以及关于使用Calcite的一般信息,请参见该教程:https://calcite.apache.org/docs/howto.html

现状

Calcite具有以下功能特性:

  • sql查询解析器、验证器和优化器
  • 支持从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相同),更多细节请参考资料:https://calcite.apache.org/docs/reference.html
  • 支持本地和远程JDBC驱动,详情见:https://calcite.apache.org/docs/avatica_overview.html
  • 支持多种适配器,详情见:https://calcite.apache.org/docs/adapter.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tyrant Lucifer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景概述
  • 写一个适配器
  • 现状
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档