Spark Streaming核心编程总结(四)

一、有状态转化操作:UpdateStateByKey

概念与作用

UpdateStateByKey 用于在流式计算中跨批次维护状态(如累加统计词频)。它允许基于键值对形式的DStream,通过自定义状态更新函数,将历史状态与新数据结合,生成包含最新状态的DStream。

实现步骤

  1. 定义状态类型:状态可以是任意数据类型(如示例中的Int类型)。

  2. 定义状态更新函数:接收当前批次的数据序列和旧状态,返回新状态。

Scala 复制代码
val updateFunc = (values: Seq[Int], state: Option[Int]) => {
val currentCount = values.sum
val previousCount = state.getOrElse(0)
Some(currentCount + previousCount)
}
  1. 配置检查点目录:必须设置检查点以持久化状态,确保容错性。
Scala 复制代码
ssc.checkpoint("./ck")
  1. 应用操作:通过updateStateByKey将函数作用于键值对DStream。
Scala 复制代码
val stateDStream = pairs.updateStateByKey[Int](updateFunc)

二、窗口操作:WindowOperations

概念与作用

窗口操作基于时间窗口动态处理数据,适用于滑动统计(如最近12秒内的词频)。需定义两个参数:

窗口时长:计算的时间范围(如Seconds(12))。

滑动步长:触发计算的间隔(如Seconds(6))。

实现示例

Scala 复制代码
val wordCounts = pairs.reduceByKeyAndWindow(
(a: Int, b: Int) => a + b, // 聚合函数
Seconds(12), // 窗口时长
Seconds(6) // 滑动步长
)

三、DStream输出操作

输出操作触发DStream的实际计算,支持多种数据落地方式:

  1. 基础输出

print():打印每批次前10个元素,用于调试。

saveAsTextFiles / saveAsObjectFiles / saveAsHadoopFiles:将数据保存为文本、序列化文件或Hadoop格式。

  1. 通用输出:foreachRDD

允许对每个RDD执行自定义操作(如写入数据库)。需注意:

连接管理:避免在Driver端创建连接(序列化问题),应在foreachPartition中按分区创建。

资源优化:每个分区建立一次连接,而非每条数据,减少开销。

示例:

Scala 复制代码
wordCounts.foreachRDD { rdd =>
rdd.foreachPartition { partition =>
val connection = createDatabaseConnection()
partition.foreach(data => connection.write(data))
connection.close()
}
}
相关推荐
snhna几秒前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
天行健,君子而铎32 分钟前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
别动我齐刘海41 分钟前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
牛战士coding1 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
必须得开心呀1 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
goehou2 小时前
MCP 查数实战:让 LLM 安全地查数据库(只读账号、SQL 校验、参数漂移)
数据库·ai·llm·教程·mcp·function calling
code2cat2 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe2 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
我不会插花弄玉2 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql
泡茶喝茶写代码2 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口