Apache Flink 提供了两种关系型 API 用于统一流和批处理,Table 和 SQL API。
- Table API 是一种集成在 Java、Scala 和 Python 语言中的查询 API,简单理解就是用 Java、Scala、Python 按照 SQL 的查询接口封装了一层 lambda 表达式的查询 API,它允许以强类型接口的方式组合各种关系运算符(如选择、筛选和联接)的查询操作,然后生成一个 Flink 任务运行。 ```java
import org.apache.flink.table.api.*;
import static org.apache.flink.table.api.Expressions.*;
EnvironmentSettings settings = EnvironmentSettings .newInstance() .inStreamingMode() .build();
TableEnvironment tEnv = TableEnvironment.create(settings);
// 下面就是 Table API 的案例,其语义等同于
// select a, count(b) as cnt
// from Orders
// group by a
DataSet
result.print();
2. SQL API 是基于 SQL 标准的 Apache Calcite 框架实现的,我们可以使用纯 SQL 来开发和运行一个 Flink 任务。如下案例所示:
```sql
insert into target
select a, count(b) as cnt
from Orders
group by a
注意:无论输入是连续(流处理)还是有界(批处理),在 Table 和 SQL 任一 API 中同一条查询语句是具有相同的语义并且会产出相同的结果的。这就是说为什么 Flink SQL 和 Table API 可以做到在用户接口层面的流批统一。xdm,用一套 SQL 既能跑流任务,也能跑批任务,它不香嘛?
Table API 和 SQL API 也与 DataStream API 做到了无缝集成。可以轻松地在三种 API 之间灵活切换。例如,可以使用 SQL 的 MATCH_RECOGNIZE 子句匹配出异常的数据,然后使用再转为 DataStream API 去灵活的构建针对于异常数据的自定义报警机制。
如何使用
- 环境依赖
- 相关基本概念
相关特性
- 自定义函数
- SQL动态表&连续查询
- 时间属性