Apache Calcite(一):初识
搬运翻译自Apache Calcite
1.背景
Calcite can handle any data source and data format.
Apache Calcite是一个动态数据管理框架。它将数据存储和数据处理分离出去,专注于成为配置应用与一个或者多个数据存储位置以及数据处理引擎的中间件。
Calcite只需要输入数据即可。
1.1 Calcite如何整理输入数据
Calcite可以处理任何数据源和数据格式。要添加数据源,首先需要编写一个适配器adapter,告诉Calcite如何组织DataSource中的数据为“表”。
首先创建schema
直接读内存数据,在
ReflectiveSchema.create
注册一个对象作为schema使用JDBC时,有
JdbcSchema.create
之后按schema收集字段作为表
1.2 Calcite提供的功能
查询解析、验证、优化
读取JSON格式
许多标准和聚合函数
针对LINQ4j前端和JDBC后端
SQL:
SELECT FROM(包括JOIN语法),WHERE,GROUP BY(包括GROUPING SETS),聚合函数(包括COUNT(DISTINCT ...)和FILTER),HAVING,ORDER BY(包括NULLS FIRST / LAST)UNION,INTERSECT,MINUS),子查询(包括相关的子查询),窗口集合,LIMIT(语法为Postgres)
本地和远程JDBC驱动(Avatica)
若干adapter
2.体验
以Calcite-example-CSV为例,完成以Calcite为中间件使用SQL读取CSV格式文本数据
此CSV adapter可以作为其他数据格式adapter的模版
此adapter中,能看出一个适配器应该:
通过 SchemaFactory 和 Schema 接口 实现用户定义schema
schemas和views都以一个JSON模型文件中声明
确定表的纪录类型
ScannableTable接口可以枚举所有行(Table的简单实现)
FilterableTable接口根据简单的谓词进行过滤
TranslatableTable接口使用planner rules转换相关操作(Table的高级实现)
2.1 简单构建
环境准备:JDK1.7以上,git,maven3.2.1以上
$ git clone https://github.com/apache/calcite.git
$ cd calcite
$ mvn install -DskipTests -Dcheckstyle.skip=true
$ cd example/csv
连接到Calcite
$ ./sqlline
sqlline> !connect jdbc:calcite:model=target/test-classes/model.json admin admin
---------windows command 中运行的话为sqlline.bat
执行元数据查询:
sqlline> !tables
+------------+--------------+-------------+---------------+----------+------+
| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE |
+------------+--------------+-------------+---------------+----------+------+
| null | SALES | DEPTS | TABLE | null | null |
| null | SALES | EMPS | TABLE | null | null |
| null | SALES | HOBBIES | TABLE | null | null |
| null | metadata | COLUMNS | SYSTEM_TABLE | null | null |
| null | metadata | TABLES | SYSTEM_TABLE | null | null |
+------------+--------------+-------------+---------------+----------+------+
(Tips:sqlline中!tables
命令只是DatabaseMetaData.getTables()在后台执行 ,它还有其他命令来查询JDBC元数据,例如!columns
和!describe
。)
其他SQL操作,扫描、分组、内置函数
sqlline> SELECT * FROM emps;
...
sqlline> SELECT d.name, COUNT(*)
. . . .> FROM emps AS e JOIN depts AS d ON e.deptno = d.deptno
. . . .> GROUP BY d.name;
...
sqlline> VALUES CHAR_LENGTH('Hello, ' || 'world!');
2.2 Schema
JDBC连接信息里给出schema的json文件路径,内容为:
{
version: '1.0',
defaultSchema: 'SALES',
schemas: [
{
name: 'SALES',
type: 'custom',
factory: 'org.apache.calcite.adapter.csv.CsvSchemaFactory',
operand: {
directory: 'target/test-classes/sales'
}
}
]
}
name:模式名,对应数据库名
type:模式类型,custom为自定以
factory:指明适配器类
adapter类的create方法,传入参数,实例化一个schema
operand.directory:指明元数据路径
模式的工作是扫描directory下满足要求后缀的的文件,以CsvSchema将数据解析为Table