flink-21 flink之table和SQL

本文介绍了Flink的关系型编程接口Table API和SQL,它们提供了统一处理批量和实时计算的能力。Table API允许直观地组合关系运算符,而SQL基于Apache Calcite实现,支持批流一体的查询。文章详细讲解了如何创建Table,从文件和DataStream中导入数据,使用TableEnvironment,以及Table API中的窗口操作。此外,还涵盖了SQL在Flink中的应用,包括窗口函数和将Table转换为DataStream的两种模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

table与SQL的基本介绍

在Spark中有DataFrame这样的关系型编程接口,因其强大且灵活的表达能力,能够让用户通过非常丰富的接口对数据进行处理,有效降低了用户的使用成本。
Flink也提供了关系型编程接口 Table API 以及基于Table API 的 SQL API,让用户能够通过使用结构化编程接口高效地构建Flink应用。同时Table API 以及 SQL 能够统一处理批量和实时计算业务, 无须切换修改任何应用代码就能够基于同一套 API 编写流式应用和批量应用,从而达到真正意义的批流统一。

  • Flink有两个关系型API: Table APISQL,用于统一流处理和批处理
    • Table API 是用于 Scala 和 Java 语言的查询API,允许以非常直观的方式组合关系运算符的查询,例如 select,filter 和 join。
    • Flink SQL 的支持是基于实现了SQL标准的 Apache Calcite。无论输入是批输入(DataSet)还是流输入(DataStream),任一接口中指定的查询都具有相同的语义并指定相同的结果。
  • Table API和SQL接口彼此集成,Flink的DataStream和DataSet API亦是如此。我们可以轻松地在基于API构建的所有API和库之间切换。

注意
到目前最新版本为止,Table API和SQL还有很多功能正在开发中。 并非[Table API,SQL]和[stream,batch]输入的每种组合都支持所有操作

在这里插入图片描述

为什么需要SQL

  • Table API 是一种关系型API,类 SQL 的API,用户可以像操作表一样地操作数据(即关系型API), 非常的直观和方便。

  • SQL 作为一个"人所皆知"的语言,如果一个引擎提供 SQL,它将很容易被人们接受。这已经是业界很常见的现象了。

  • Table & SQL API 还有另一个职责,就是流处理和批处理统一的API层。
    在这里插入图片描述

开发环境构建

  • 在 Flink 1.9 中,Table 模块迎来了核心架构的升级,引入了阿里巴巴 Blink 团队贡献的诸多功能,取名叫: Blink Planner。

  • 在使用 Table API 和 SQL 开发 Flink 应用之前,通过添加 Maven 的依赖配置到项目中,在本地工程中引入相应的依赖库,库中包含了 Table API 和 SQL 接口。

  • 添加pom依赖

<dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-planner_2.11</artifactId>
            <version>1.9.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-api-scala-bridge_2.11</artifactId>
            <version>1.9.2</version>
</dependency>

TableEnvironment

TableEnvironment用来创建关系型编程环境。TableEnvironment 中提供了

  • 注册内部表
  • 执行 Flink SQL 语句
  • 注册自定义函数等功能。

根据应用类型的不同,TableEnvironment 创建方式也有所不同,但是都是通过调用 create()方法创建

流计算环境下创建 TableEnviroment

//初始化Flink的Streaming(流计算)上下文执行环境 
val streamEnv: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment 
//初始化Table API的上下文环境 
val tableEvn =StreamTableEnvironment.create(streamEnv)

在 Flink1.9 之后由于引入了 Blink Planner

val bsSettings = EnvironmentSettings.newInstance().useOldPlanner().inStreamingMode().build() 
val bsTableEnv = StreamTableEnvironment.create(streamEnv, bsSettings)

注意
Flink 社区完整保留原有 Flink Planner (Old Planner),同时又引入了新的Blink Planner,用户可以自行选择使用 Old Planner 还是 Blink Planner。官方推荐暂时使用 Old Planner

Table API

在 Flink 中创建一张表有两种方法:

  • 从一个文件中导入表结构(Structure)(常用于批计算)(静态)
  • 从 DataStream 或者 DataSet 转换成 Table (动态)

创建 Table

Table API 中已经提供了 TableSource 从外部系统获取数据,例如常见的数据库、文件

系统和 Kafka 消息队列等外部系统。

从文件中创建 Table(静态表)

需求

  • 读取csv文件,文件内容参见课件当中的flinksql.csv文件,查询年龄大于18岁的人,并将结果写入到csv文件里面去,这里涉及到flink的connect的各种与其他外部系统的连接,参见
    官网链接:Connect to External Systems

代码示例

import org.apache.flink.api.common.typeinfo.TypeInformation
import org.apache.flink.core.fs.FileSystem.WriteMode
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.table.api.{
   Table, Types}
import org.apache.flink.table.api.scala.StreamTableEnvironment
import org.apache.flink.table.sinks.CsvTableSink
import org.apache.flink.table.sources.CsvTableSource

object table_static {
   
  def main(args: Array[String]): Unit = {
   
    //构建流处理环境
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    //构建tableEnvironment
    val tableEnvironment: StreamTableEnvironment = StreamTableEnvironment.create(env)
    //构建CSV数据源
    val source: CsvTableSource = CsvTableSource.builder()
      .path("F:\\BigData\\data\\flinksql.csv")
      .field("id", Types.INT())
      .field("name", Types.STRING())
      .field("age", Types.INT())
      .fieldDelimiter(
第一章 整体介绍 2 1.1 什么是 Table API Flink SQL 2 1.2 需要引入的依赖 2 1.3 两种 planner(old & blink)的区别 4 第二章 API 调用 5 2.1 基本程序结构 5 2.2 创建表环境 5 2.3 在 Catalog 中注册表 7 2.3.1 表(Table)的概念 7 2.3.2 连接到文件系统(Csv 格式) 7 2.3.3 连接到 Kafka 8 2.4 表的查询 9 2.4.1 Table API 的调用 9 2.4.2 SQL 查询 10 2.5 将 DataStream 转换成表 11 2.5.1 代码表达 11 2.5.2 数据类型与 Table schema 的对应 12 2.6. 创建临时视图(Temporary View) 12 2.7. 输出表 14 2.7.1 输出到文件 14 2.7.2 更新模式(Update Mode) 15 2.7.3 输出到 Kafka 16 2.7.4 输出到 ElasticSearch 16 2.7.5 输出到 MySql 17 2.8 将表转换成 DataStream 18 2.9 Query 的解释执行 20 1. 优化查询计划 20 2. 解释成 DataStream 或者 DataSet 程序 20 第三章 流处理中的特殊概念 20 3.1 流处理关系代数(表,及 SQL)的区别 21 3.2 动态表(Dynamic Tables) 21 3.3 流式持续查询的过程 21 3.3.1 将流转换成表(Table) 22 3.3.2 持续查询(Continuous Query) 23 3.3.3 将动态表转换成流 23 3.4 时间特性 25 3.4.1 处理时间(Processing Time) 25 3.4.2 事件时间(Event Time) 27 第四章 窗口(Windows) 30 4.1 分组窗口(Group Windows) 30 4.1.1 滚动窗口 31 4.1.2 滑动窗口 32 4.1.3 会话窗口 32 4.2 Over Windows 33 1) 无界的 over window 33 2) 有界的 over window 34 4.3 SQL 中窗口的定义 34 4.3.1 Group Windows 34 4.3.2 Over Windows 35 4.4 代码练习(以分组滚动窗口为例) 36 第五章 函数(Functions) 38 5.1 系统内置函数 38 5.2 UDF 40 5.2.1 注册用户自定义函数 UDF 40 5.2.2 标量函数(Scalar Functions) 40 5.2.3 表函数(Table Functions) 42 5.2.4 聚合函数(Aggregate Functions) 45 5.2.5 表聚合函数(Table Aggregate Functions) 47
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值