概述
Apache Flink具有两个关系API - 表API和SQL - 用于统一流和批处理。Table API是Scala和Java的语言集成查询API,允许以非常直观的方式组合来自关系运算符的查询,例如selection, filter, 和join.Flink的SQL支持基于实现SQL标准的Apache Calcite。无论输入是批输入(DataSet)还是流输入(DataStream),任一接口中指定的查询都具有相同的语义并指定相同的结果。
表API和SQL接口以及Flink的数据流和数据集API紧密集成在一起。您可以轻松地在所有基于API的API和库之间切换。例如,可以使用CEP库从数据流中提取模式,然后使用表API分析模式,或者在对预处理数据运行Gelly图算法之前,可以使用SQL查询扫描、筛选和聚合批处理表。
maven
表API和SQL捆绑在Flink Table Maven工件中。为了使用表API和SQL,必须将以下依赖项添加到项目中:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table_2.11</artifactId>
<version>1.6.1</version>
</dependency>
此外,您需要为Flink的Scala批处理或流API添加依赖项。对于批处理查询,您需要添加:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.6.1</version>
</dependency>
对于流式查询,您需要添加:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.6.1</version>
</dependency>
概念和通用API
表API和SQL集成在一个联合API中。这个API的中心概念是一个表,它用作查询的输入和输出。本文档展示了使用表API和SQL查询的程序的公共结构、如何注册表、如何查询表以及如何发出表。
表API和SQL程序的结构
批处理和流式传输的所有Table API和SQL程序都遵循相同的模式。以下代码示例显示了Table API和SQL程序的常见结构。
// 对于批处理程序,使用ExecutionEnvironment而不是StreamExecutionEnvironment
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// create a TableEnvironment
// for batch programs use BatchTableEnvironment instead of StreamTableEnvironment
StreamTableEnvironment tableEnv = TableEnvironment.getTableEnvironment(env);
// register a Table
tableEnv.registerTable("table1", ...) // or
tableEnv.registerTableSource("table2", ...); // or
tableEnv.registerExternalCatalog("extCat", ...);
// create a Table from a Table API query
Table tapiResult = tableEnv.scan("table1").select(...);
// create a Table from a SQL query
Table sqlResult = tableEnv.sqlQuery("SELECT ... FROM table2 ... ");
// 向TableSink发出表API结果表,与SQL结果相同
tapiResult.writeToSink(...);
// execute
env.execute();