Flink Table API与SQL流数据处理实战

目录

代码解释

[1. 环境设置](#1. 环境设置)

[2. 数据转换](#2. 数据转换)

[3. Table 环境设置](#3. Table 环境设置)

[4. 基于流创建表](#4. 基于流创建表)

[5. Table API 操作](#5. Table API 操作)

[6. SQL 操作](#6. SQL 操作)

[7. 结果输出](#7. 结果输出)

背景知识拓展

[1. Flink Table API 和 SQL](#1. Flink Table API 和 SQL)

[2. 流与表的转换](#2. 流与表的转换)

[3. 临时视图](#3. 临时视图)

[4. Flink 的流处理与批处理](#4. Flink 的流处理与批处理)

[5. 结构化数据处理](#5. 结构化数据处理)

[6. Flink 的应用场景](#6. Flink 的应用场景)

[7. Flink 的生态系统](#7. Flink 的生态系统)

进一步学习


Scala 复制代码
package table

import api.SensorReading
import org.apache.flink.streaming.api.scala._
import org.apache.flink.table.api.scala._


/**
 *
 * @PROJECT_NAME: Flink
 * @PACKAGE_NAME: table
 * @author: 赵嘉盟-HONOR
 * @data: 2025-05-15 13:38
 * @DESCRIPTION
 *
 */
object Example {
  def main(args: Array[String]): Unit = {
    val env=StreamExecutionEnvironment.getExecutionEnvironment
    val stream=env.readTextFile("Flink/src/main/resources/source.txt")
    //先转换样例类(简单转换操作)
    val dataStream=stream
      .map(data=>{
        val arr=data.split(",")
        SensorReading(arr(0),arr(1).toLong,arr(2).toDouble)
      })
    dataStream.print()

    //首先创建表执行环境
    val tableEnv=StreamTableEnvironment.create(env)
    //基于流创建一张表
    val dataTable=tableEnv.fromDataStream(dataStream)

    //调用table api 进行转换
    val resultTable=dataTable
      .select("id,temperature")
      .filter("id='sensor_1'")

    //直接用SQL实现
    tableEnv.createTemporaryView("dataTable",dataTable)
    val sql="select id,temperature from dataTAble where id='sensor_1'"
    val resultSqlTable=tableEnv.sqlQuery(sql)

    resultTable.toAppendStream[(String,Double)].print("result")
    resultSqlTable.toAppendStream[(String,Double)].print("result sql")

    env.execute("table api example")
  }
}

这段代码展示了如何使用 Apache Flink 的 Table APISQL 对流数据进行处理。以下是代码的详细解释和背景知识拓展。


代码解释

1. 环境设置
Scala 复制代码
val env = StreamExecutionEnvironment.getExecutionEnvironment
val stream = env.readTextFile("Flink/src/main/resources/source.txt")
  • StreamExecutionEnvironment.getExecutionEnvironment:获取流处理执行环境。
  • env.readTextFile:从本地文件读取数据流。
2. 数据转换
Scala 复制代码
val dataStream = stream
  .map(data => {
    val arr = data.split(",")
    SensorReading(arr(0), arr(1).toLong, arr(2).toDouble)
  })
dataStream.print()
  • map:将每行数据转换为 SensorReading 对象,包含 idtimestamptemperature 字段。
  • dataStream.print():打印转换后的数据流。
3. Table 环境设置
Scala 复制代码
val tableEnv = StreamTableEnvironment.create(env)
  • StreamTableEnvironment.create:创建 Table 执行环境,用于将流数据转换为表并进行操作。
4. 基于流创建表
Scala 复制代码
val dataTable = tableEnv.fromDataStream(dataStream)
  • tableEnv.fromDataStream:将 dataStream 转换为 Table。
5. Table API 操作
Scala 复制代码
val resultTable = dataTable
  .select("id, temperature")
  .filter("id = 'sensor_1'")
  • select:选择 idtemperature 字段。
  • filter:过滤出 idsensor_1 的数据。
6. SQL 操作
Scala 复制代码
tableEnv.createTemporaryView("dataTable", dataTable)
val sql = "select id, temperature from dataTable where id = 'sensor_1'"
val resultSqlTable = tableEnv.sqlQuery(sql)
  • createTemporaryView:将 dataTable 注册为临时视图 dataTable
  • sqlQuery:执行 SQL 查询,筛选出 idsensor_1 的数据。
7. 结果输出
Scala 复制代码
resultTable.toAppendStream[(String, Double)].print("result")
resultSqlTable.toAppendStream[(String, Double)].print("result sql")
env.execute("table api example")
  • toAppendStream:将 Table 转换回数据流。
  • print:打印结果。
  • env.execute:启动流处理任务。

背景知识拓展

  • Table API:Flink 提供的一种声明式 API,用于处理结构化数据。它类似于 SQL,但以编程方式实现。
  • SQL:Flink 支持标准 SQL 查询,可以直接对表执行 SQL 操作。
  • 优势:Table API 和 SQL 提供了更简洁、直观的方式来处理数据,特别适合处理结构化数据。
2. 流与表的转换
  • 流转表 :通过 tableEnv.fromDataStream 将数据流转换为表。
  • 表转流 :通过 toAppendStreamtoRetractStream 将表转换回数据流。
  • Append 模式:适用于只有插入操作的表。
  • Retract 模式:适用于有更新或删除操作的表。
3. 临时视图
  • 作用:将表注册为临时视图,以便在 SQL 查询中使用。
  • 生命周期:临时视图的生命周期与 Flink 任务的执行周期一致。
  • 流处理:处理无界数据流,适用于实时场景。
  • 批处理:处理有界数据集,适用于离线场景。
  • 统一 API:Flink 提供了统一的 API,可以同时处理流和批数据。
5. 结构化数据处理
  • 结构化数据:具有固定模式的数据,如关系型数据库中的表。
  • 半结构化数据:如 JSON、XML 等。
  • 非结构化数据:如文本、图像等。
  • 实时数据分析:如日志分析、用户行为分析。
  • 实时 ETL:将数据从源系统提取、转换并加载到目标系统。
  • 事件驱动应用:如实时推荐、实时风控。
  • Connectors:支持 Kafka、HDFS、JDBC 等多种数据源和目标。
  • State & Checkpoint:提供状态管理和容错机制。
  • CEP(Complex Event Processing):用于处理复杂事件模式。

进一步学习

通过这段代码的学习,你可以掌握如何使用 Flink 的 Table API 和 SQL 处理流数据,并了解流与表的转换、临时视图等核心概念。

相关推荐
喜欢的名字被抢了7 小时前
MySQL核心机制:事务、锁与存储引擎
数据库·sql·mysql·教程
万点科技码农7 小时前
2025年7月11日行业热点解读:定制软件开发与AI工作流重构一体化趋势
大数据·人工智能·重构
Regentsoft丽晶软件7 小时前
从“等客进店”到“上门成交”:服装门店移动POS离店收银的完整业务流程2026
大数据·经验分享·用户运营·零售
dayuOK63077 小时前
AI Agent市场爆发:从“试一试”到“离不开”,只用了不到一年
大数据·人工智能·ai作画·新媒体运营·aigc·ai写作
海外数字观察家8 小时前
马来西亚商贸数字化落地指南:跨境批发、连锁零售首选ERP方案(品未云)
大数据·人工智能·马来西亚进销存系统·马来西亚收银系统·马来西亚erp系统·马来西亚仓库管理系统
珠海西格电力8 小时前
数据采集与治理:零碳园区管理系统的 “生命线”
大数据·人工智能·算法·架构·能源
阿演10 小时前
DataDjinn v0.2.11:SQL 编辑、AI 协作和表格操作继续打磨
数据库·人工智能·sql
智慧景区与市集主理人10 小时前
巨有科技智慧康养|避开康养文旅内卷,做能变现的疗愈数字化
大数据·人工智能·科技
峥嵘life10 小时前
Repo 常用操作手册
大数据·elasticsearch·搜索引擎
ZeekerLin11 小时前
AI 原生开发落地路线图:从个人提效到团队体系化
大数据·人工智能