Table API是流处理和批处理通用的关系型API,Table API可以基于流输入或者批输入来运行而不需要进行任何修改。Table API是SQL语言的超集并专门为Apache Flink设计的,Table API是Scala 和Java语言集成式的API。与常规SQL语言中将查询指定为字符串不同,Table API查询是以Java或Scala中的语言嵌入样式来定义的,具有IDE支持如:自动完成和语法检测。
Table API与Flink的SQL集成共享许多其API的概念和部分,请参考通用的概念和API来了解如何注册table或者创建一个Table对象,Streaming Concepts页讨论了特殊的概念如:动态表和时间属性。
接下来的例子中假设注册了一个名叫Orders的表并有(a, b, c, rowtime)属性,rowtime字段可以是流中的逻辑时间字段或者是批中的常规时间戳字段。
概述和实例
Table API可以用于Scala和Java中,Scala Table API利用了Scala表达式,Java Table API则是基于字符串来的,字符串会被解析并转换成等价的表达式。
接下来的例子展示了Scala 和 Java Table API的不同之处,表程序是在批环境中执行的,它扫描Orders表,根据a字段来分组,并计算每个分组的结果,表程序的结果转换为一个Row类型的DataSet并打印出来。
Java Table API可以通过导入org.apache.flink.table.api.java.*来启用,下面的例子展示了Java Table API程序如何构建及表达式如何指定为字符串。
// 配置环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
BatchTableEnvironment tEnv = TableEnvironment.getTableEnvironment(env);
// 在表环境中注册Orders表
// ...
// 指定一个表程序
Table orders = tEnv.scan("Orders"); // schema (a, b, c, rowtime)
Table counts = orders
.groupBy("a")
.select("a, b.count as cnt");
// 结果转换为 DataSet
DataSet result = tableEnv.toDataSet(counts, Row.class);
result.print();
Scala Table API可以通过导入org.apache.flink.api.scala._和org.apache.flink.table.api.scala._包来启用。
下面例子展示了Scala Table API如何构建, Table属性使用Scala表达式来引用,Scala表达式以`开头:
import org.apache.flink.api.scala._
import org.apache.flink.table.api.scala._
// 配置环境
val env = ExecutionEnvironment.getExecution