Wait the light to fall

Table API 和 SQL

焉知非鱼

Table API & SQL

Table API 和 SQL #

Apache Flink 具有两个关系型 API - Table API 和 SQL - 用于统一的流和批处理。Table API 是 Scala 和 Java 的语言集成查询 API,它允许用非常直观的方式从关系运算符(如选择、过滤和连接)组成查询。Flink 的 SQL 支持是基于 Apache Calcite,它实现了 SQL 标准。无论输入是批处理输入(DataSet)还是流输入(DataStream),在任一接口中指定的查询都具有相同的语义,并指定相同的结果。

表 API 和 SQL 接口与 Flink 的 DataStream 和 DataSet API 紧密集成。你可以很容易地在所有 API 和建立在 API 基础上的库之间切换。例如,您可以使用 CEP 库 从 DataStream 中提取模式,随后使用 Table API 来分析模式,或者您可能会在预处理数据上运行 Gelly 图算法之前,使用 SQL 查询扫描、过滤和聚合一个批处理表。

请注意,Table API 和 SQL 的功能还不完善,正在积极开发中。并非所有的操作都被 [Table API, SQL] 和 [stream, batch] 输入的每个组合所支持。

依赖结构 #

从 Flink 1.9 开始,Flink 为评估 Table & SQL API 程序提供了两种不同的规划器实现:Blink planner 和 Flink 1.9 之前的旧 planner。Planner 负责将关系运算符转化为可执行的、优化的 Flink 作业。这两种 planner 都有不同的优化规则和运行时类。它们在支持的功能集上也可能有所不同。

注意: 对于生产用例,我们推荐 blink planner,它从 1.11 开始成为默认 planner。

所有的 Table API 和 SQL 组件都捆绑在 flink-table 或 flink-table-blink Maven 构件中。

以下是与大多数项目相关的依赖关系。

  • flink-table-common: 一个通用模块,用于通过自定义函数、格式等扩展表生态系统。
  • flink-table-api-java: 使用 Java 编程语言的纯表程序的 Table & SQL API(处于早期开发阶段,不推荐!)。
  • flink-table-api-scala: Table 和 SQL API,用于使用 Java 编程语言的纯表程序(处于早期开发阶段,不推荐)。
  • flink-table-api-java-bridge: 使用 Java 编程语言支持 DataStream/DataSet API 的 Table & SQL API。
  • flink-table-api-scala-bridge: 使用 Scala 编程语言,支持 DataStream/DataSet API 的表和 SQL API。
  • flink-table-planner: 表程序 planner 和运行时。这是在 1.9 版本之前 Flink 唯一的 planner。从 Flink 1.11 开始,不再推荐使用它。
  • flink-table-planner-link: 新的 Blink 计划器,从 Flink 1.11 开始成为默认的。
  • flink-table-runtim-blink: 新的 Blink 运行时。
  • flink-table-uber: 将上面的 API 模块加上旧的规划器打包成一个适用于大多数 Table & SQL API 使用案例的发行版。uber JAR 文件 flink-table-*.jar 默认位于 Flink 版本的 /lib 目录下。
  • flink-table-uber-blink: 将上面的 API 模块加上 Blink 的特定模块打包成一个适用于大多数 Table & SQL API 用例的发行版。uber JAR 文件 flink-table-blink-*.jar 默认位于 Flink 版本的 /lib 目录下。

关于如何在表程序中切换新旧 Blink planner,请参见通用 API 页面。

表程序依赖 #

根据目标编程语言的不同,您需要将 Java 或 Scala API 添加到项目中,以便使用 Table API 和 SQL 来定义管道。

<!-- Either... -->
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-table-api-java-bridge_2.11</artifactId>
  <version>1.11.0</version>
  <scope>provided</scope>
</dependency>
<!-- or... -->
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-table-api-scala-bridge_2.11</artifactId>
  <version>1.11.0</version>
  <scope>provided</scope>
</dependency>

此外,如果你想在 IDE 中本地运行 Table API 和 SQL 程序,你必须添加以下一组模块,这取决于你想使用的计划器。

<!-- 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.11.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.11.0</version>
  <scope>provided</scope>
</dependency>

在内部,表生态系统的部分内容是在 Scala 中实现的。因此,请确保为批处理和流应用添加以下依赖关系。

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-streaming-scala_2.11</artifactId>
  <version>1.11.0</version>
  <scope>provided</scope>
</dependency>

扩展依赖性 #

如果你想实现与 Kafka 交互的自定义格式或一组用户定义的函数,下面的依赖就足够了,可以用于 SQL 客户端的 JAR 文件。

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-table-common</artifactId>
  <version>1.11.0</version>
  <scope>provided</scope>
</dependency>

目前,该模块包括以下扩展点:

  • SerializationSchemaFactory
  • DeserializationSchemaFactory
  • ScalarFunction
  • TableFunction
  • AggregateFunction

下一步怎么走? #

  • 概念与通用 API: Table API 和 SQL 的共享概念和 API。
  • 数据类型: 列出了预先定义的数据类型及其属性。
  • 流概念: 表 API 或 SQL 的流特定文档,如时间属性的配置和更新结果的处理。
  • 连接到外部系统: 可用的连接器和格式,用于向外部系统读写数据。
  • Table API。支持的操作和表 API 的 API。
  • SQL。支持 SQL 的操作和语法。
  • 内置函数: 表 API 和 SQL 中支持的函数。
  • SQL 客户端: 玩转 Flink SQL,并向集群提交表格程序,无需编程知识。

原文链接: https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/