Calcite 背景介绍

2022-01-18 21:55:35 浏览数 (1)

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 en"
      "join hr.depts as dn"
      "  on e.deptno = d.deptnon"
      "group by d.deptnon"
      "having count(*) > 1");
print(resultSet);
resultSet.close();
statement.close();
connection.close();Copy

数据库在哪里?没有数据库。连接是完全空的,直到new ReflectiveSchema将Java对象注册为模式,并将其集合字段emps和depts注册为表。

Calcite不需要自己保存数据;它甚至没有最喜欢的数据格式。本示例使用内存中的数据集,并使用来自linq4j库的join和groupBy等操作符处理它们。但是Calcite也可以处理其他数据格式的数据,比如JDBC。在第一个例子中,替换

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

为:

代码语言: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");Copy

Calcite将在JDBC中执行相同的查询。对于应用程序来说,数据和API是相同的,但在幕后实现是非常不同的。Calcite使用优化器规则将JOIN和GROUP BY操作推入源数据库。

内存和JDBC只是两个熟悉的例子。Calcite可以处理任何数据源和数据格式。要添加数据源,需要编写一个适配器,告诉方解石数据源中应该考虑哪些集合为“表”。

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

写一个适配器

example/csv下的子项目提供了一个csv适配器,它可以在应用程序中完全使用,但如果您正在编写自己的适配器,它也足够简单,可以作为一个好的模板。

有关使用CSV适配器和编写其他适配器的信息,请参阅教程。

有关使用其他适配器以及一般使用方解石的更多信息,请参阅HOWTO。

目前状态

完成了以下功能。

  • 查询解析器、验证器和优化器
  • 支持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);更多细节见SQL引用
  • 本地和远程JDBC驱动程序;看到Avatica
  • 几个适配器

本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://cloud.tencent.com/developer/article/1936477

0 人点赞