Table API & SQL
Apache Flink具有两个关系API-Table API和SQL-用来统一流和批处理。Table API是用于Scala和Java语言的集成查询API,它以非常直观的方式组合来自关系运算符(如selection,filter和join)的查询。Flink对SQL的支持基于实现SQL标准的Apache Calcite。无论是批输入(DataSet)还是流输入(DataStream),在两个接口中指定的查询具有相同的语义并指定相同的结果。
Table API和SQL接口以及Flink的DataStream和DataSet API紧密集成在一起。你可以在所有API和基于这些API的库之间轻松切换。例如,你可以使用CEP库从DataStream中提取模式,然后再使用Table API分析模式,或者,在对预处理数据运行Gelly 图形算法之前,可以使用SQL query来扫描、过滤和聚合批处理表。
请注意,Table API和SQL的部分功能尚未完成,正在积极开发中。[Table API,SQL]和[stream,batch]输入的各种组合并非都支持所有操作。
依赖结构
从Flink 1.9开始,Flink提供了两种不同的planner实现来评估Table&SQL API程序:Blink planner和Flink 1.9之前用的旧planner。Planners负责将关系运算符转换为可执行的,优化的Flink作业。两个planner都带有不同的优化规则和运行时类。它们在支持的特性方面也有所不同。
注意:对于生产案例,建议使用Flink 1.9之前的旧的planner。
所有Table API和SQL组件都捆绑在flink-table或flink-table-blink的Maven构件中。
大部分项目会使用如下依赖:
- flink-table-common:用于通过自定义功能,格式等扩展table 生态系统的通用模块。
- flink-table-api-java:适用于使用Java编程语言的纯table程序的Table&SQL API(处于开发初期,不建议使用!)。
- flink-table-api-scala:使用Scala编程语言的纯table程序的Table&SQL API(处于开发初期,不建议使用!)。
- flink-table-api-java-bridge:使用Java编程语言,带有DataStream / DataSet API的Table&SQL API支持。
- flink-table-api-scala-bridge:使用Scala编程语言支持具有DataStream / DataSet API的Table&SQL API。
- flink-table-planner:table程序planner和runtime。这是1.9版本之前Flink的唯一planner。仍推荐使用。
- flink-table-planner-blink:新的Blink planner。
- flink-table-runtime-blink:新的Blink runtime。
- flink-table-uber:将上述API模块以及旧的planner打包到大多数Table&SQL API用例的分发中。默认情况下,uber JAR文件flink-table-*.jar位于/libFlink版本的目录下。
- flink-table-uber-blink:将上述API模块以及特定于Blink的模块打包到大多数Table&SQL API用例的分发中。默认情况下,uber JAR文件flink-table-blink-*.jar位于/libFlink版本的目录下。
有关如何在table程序中旧的和新的Blink planner之间进行切换的更多信息,请参见通用API页面。
table程序所需依赖
根据目标编程语言,你需要将Java或Scala API添加到项目中,以便使用Table API和SQL的语义:
<!-- Either... -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_2.11</artifactId>
<version>1.10.0</version>
<scope>provided</scope>
</dependency>
<!-- or... -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-scala-bridge_2.11</artifactId>
<version>1.10.0</version>
<scope>provided</scope>
</dependency>
此外,如果要在IDE中本地运行Table API和SQL程序,则必须添加以下一组模块之一,具体取决于要使用的planner:
<!-- Either... (for the old planner that was available before Flink 1.9) -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.11</artifactId>
<version>1.10.0</version>
<scope>provided</scope>
</dependency>
<!-- or.. (for the new Blink planner) -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.11</artifactId>
<version>1.10.0</version>
<scope>provided</scope>
</dependency>
在内部,table生态系统的一部分在Scala中实现。因此,请确保为批处理和流应用程序都添加以下依赖项:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.10.0</version>
<scope>provided</scope>
</dependency>
扩展依赖
如果要实现与Kafka或一组自定义函数进行交互的自定义格式,则以下依赖关系就足够了,并且可以用于SQL Client的JAR文件:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.10.0</version>
<scope>provided</scope>
</dependency>