文章目录
1.引言
Calcite作为一个强大的SQL计算引擎,在Flink内部的SQL引擎模块就是基于Calcite。但是目前Calcite的相关学习文档还是太少了,没有系统的学习资料。
2. 教程
这是一个循序渐进的教程,演示如何建立和连接Calcite。它使用一个简单的适配器,使CSV文件的目录看起来像一个包含表的schema。Calcite完成剩下的工作,并提供完整的SQL接口。
Calcite-example-CSV是Calcite的完全功能适配器,用于读取CSV(逗号分隔值)格式的文本文件。值得注意的是,几百行Java代码足以提供完整的SQL查询能力。
CSV 还可以用作构建其他数据格式适配器的模板。尽管代码行不多,但它涵盖了几个重要概念:
- 使用SchemaFactory和模式接口的用户自定义Schema
- 在模型JSON文件中声明Schemas;
- 在模型JSON文件中声明视图
- 利用Table接口来自定义表
- 确定表的记录类型
- 表的简单实现,使用ScannableTable 接口,直接枚举所有行
- 一种更高级的实现,实现FilterableTable,并可以根据简单的谓词筛选出行
- 使用TranslatableTable,该表使用计划器规则转换为关系运算符
3. 下载和编译
您需要Java(版本8, 9或10)和Git:
$ git clone https://github.com/apache/calcite.git
$ cd calcite
$ ./mvnw install -DskipTests -Dcheckstyle.skip=true
$ cd example/csv
4. 首次查询
现在让我们使用sqlline连接到Calcite,这是一个包含在这个项目中的sql shell。
$ ./sqlline
sqlline> !connect jdbc:calcite:model=target/test-classes/model.json admin admin
(如果运行的是Windows,则命令为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 |
+------------+--------------+-------------+---------------+----------+------+
(JDBC注:sqlline的!tables
命令只是在后台执行DatabaseMetaData.getTables()。它还有其他查询JDBC元数据的命令,比如 !columns
和!describe
。)
如您所见,系统中有5个表:表EMPS, DEPTS和HOBBIES是在当前SALES schema当中; COLUMNS和TABLES是在系统元数据schema中。系统表始终存在于Calcite中,但其他表由schema的具体实现提供。在这种情况下,EMPS和DEPTS表基于target/test-classes目录中的EMPS.csv和DEPTS.csv文件。
让我们对这些表执行一些查询,以显示Calcite提供了SQL的完整实现。首先,表扫描:
sqlline> SELECT * FROM emps;
+--------+--------+---------+---------+----------------+--------+-------+---+
| EMPNO | NAME | DEPTNO | GENDER | CITY | EMPID | AGE | S |
+--------+--------+---------+---------+----------------+--------+-------+---+
| 100 | Fred | 10 | | | 30 | 25 | t |
| 110 | Eric | 20 | M | San Francisco | 3 | 80 | n |
| 110 | John | 40 | M | Vancouver | 2 | null | f |
| 120 | Wilma | 20 | F | | 1 | 5 | n |
| 130 | Alice | 40 | F | Vancouver | 2 | null | f |
+--------+--------+---------+---------+------------