【Flink原理和应用】:Calcite应用指南

翻译原文:http://calcite.apache.org/docs/tutorial.html

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 |
+--------+--------+---------+---------+------------
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值