Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别

news/2024/11/21 17:18:04/

Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别

1. Spark RDD
  • 是否支持窗口操作
    RDD 本身没有专门的窗口操作算子。
  • 原因
    RDD 是一个弹性分布式数据集,设计为通用的、不可变的操作单元,主要用于批处理场景。窗口函数需要时间相关上下文,而 RDD 仅支持静态数据操作。
  • 解决方法
    若需实现类似窗口功能,可结合时间戳等自定义逻辑进行处理。例如,将数据分区按照时间区间处理,但这种方式较复杂且效率不高。

示例
通过 groupByKey 手动实现窗口逻辑:

val rdd = sc.parallelize(Seq((1L, "a"), (2L, "b"), (3L, "c")), numSlices = 2)
val windowedRdd = rdd.filter(x => x._1 > 1L && x._1 <= 3L) // 模拟时间窗口过滤
windowedRdd.collect().foreach(println)

2. Spark DStream
  • 是否支持窗口操作
    支持,DStream 提供专门的窗口操作函数,如 window, reduceByWindow, countByWindow
  • 实现原理
    DStream 是基于 RDD 的时间分段流式计算,每个时间段的数据被划分为一个 RDD。窗口函数会对多段时间的数据进行计算,底层通过对多个时间段的 RDD 进行 union 并缓存中间结果实现。
  • 适用场景
    实时数据处理,比如日志流、点击流。

源码核心片段
窗口操作WindowedDStream 会通过 union 操作合并时间范围内的 RDD:

val newRDD = dstream.slice(startTime, endTime).reduce(_.union(_))

示例

val dstream = ssc.socketTextStream("localhost", 9999)
val windowedDstream = dstream.window(Seconds(30), Seconds(10)) // 窗口大小30秒,滑动间隔10秒
windowedDstream.print()

3. Spark DataFrame
  • 是否支持窗口操作
    支持,DataFrame 中通过 SQL 风格的窗口函数实现窗口操作
  • 实现原理
    Spark SQL 使用 Catalyst 优化器,结合 Tungsten 执行引擎对窗口操作进行优化。窗口函数会生成带有分区、排序等元信息的物理计划,操作包括滑动窗口和累计窗口。
  • 适用场景
    结构化数据分析,比如计算最近 7 天内的销售额。

示例

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._val df = Seq((1, "a", 100, "2024-01-01"),(2, "b", 200, "2024-01-02"),(3, "a", 300, "2024-01-03")
).toDF("id", "category", "amount", "date")val windowSpec = Window.partitionBy("category").orderBy("date").rowsBetween(-1, 1)
val result = df.withColumn("moving_avg", avg("amount").over(windowSpec))
result.show()

4. Spark DataSet
  • 是否支持窗口操作
    支持,与 DataFrame 类似,DataSet 也支持窗口操作,底层实现机制相同。
  • 区别
    DataSet 是类型安全的 API,可以对数据进行编译时类型检查。
  • 适用场景
    需要对半结构化或结构化数据进行类型安全操作。

示例

case class Sales(id: Int, category: String, amount: Int, date: String)val ds = Seq(Sales(1, "a", 100, "2024-01-01"),Sales(2, "b", 200, "2024-01-02"),Sales(3, "a", 300, "2024-01-03")
).toDS()val windowSpec = Window.partitionBy("category").orderBy("date").rowsBetween(-1, 1)
val result = ds.withColumn("moving_avg", avg("amount").over(windowSpec))
result.show()

窗口操作的总结

特性RDDDStreamDataFrameDataSet
是否支持窗口操作不支持,需手动实现支持,提供专门的窗口算子支持,通过 SQL 风格窗口函数实现支持,通过 SQL 风格窗口函数实现
设计场景离线批处理实时流式处理结构化批处理类型安全的结构化批处理
实现方式自定义逻辑基于时间片段的 RDD UnionCatalyst 优化器 + Tungsten 引擎Catalyst 优化器 + Tungsten 引擎
优点灵活但复杂简洁高效,适合流处理强大的 SQL 支持,简化开发强大的 SQL 支持,类型安全
缺点无专门支持,效率低依赖于时间窗口定义需要熟悉 SQL 和窗口函数语法相较 DataFrame 开销略高

推荐使用场景

  • RDD:当需要完全自定义的窗口逻辑时。
  • DStream:适合处理流式数据的实时窗口操作
  • DataFrame/DataSet:推荐用于复杂窗口分析,如滑动窗口、累计窗口等结构化数据处理。

http://www.ppmy.cn/news/1548807.html

相关文章

信息学奥赛-一本通-第二部分 基础算法 --> 第五章 搜索与回溯算法

1317&#xff1a;【例5.2】组合的输出 【题目描述】 排列与组合是常用的数学方法&#xff0c;其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n)&#xff0c;我们可以简单地将n个元素理解为自然数1&#xff0c;2&#xff0c;…&#xff0c;n&#xff0c;从中任取r个数。 现…

Python-简单病毒程序合集(一)

前言&#xff1a;简单又有趣的Python恶搞代码&#xff0c;往往能给我们枯燥无味的生活带来一点乐趣&#xff0c;激发我们对编程的最原始的热爱。那么话不多说&#xff0c;我们直接开始今天的编程之路。 编程思路&#xff1a;本次我们将会用到os,paltform,threading,ctypes,sys,…

编辑器vim 命令的学习

1.编辑器Vim 1.vim是一个专注的编辑器 2.是一个支持多模式的编辑器 1.1见一见&#xff1a; vim 的本质也是一条命令 退出来&#xff1a;-> Shift:q 先创建一个文件 再打开这个文件 进入后先按 I 然后就可以输入了 输入完后&#xff0c;保存退出 按Esc --> 来到最后一…

用 Python 从零开始创建神经网络(六):优化(Optimization)介绍

优化&#xff08;Optimization&#xff09;介绍 引言 引言 在随机初始化的模型中&#xff0c;或者即使是采用更复杂方法初始化的模型中&#xff0c;我们的目标是随着时间的推移培训或教育一个模型。为了训练一个模型&#xff0c;我们调整权重和偏差以提高模型的准确性和置信度…

2024年11月15日Github流行趋势

项目名称&#xff1a;MinerU 项目维护者&#xff1a;myhloli, dt-yy, Focusshang, drunkpig, papayalove等项目介绍&#xff1a;一站式开源高质量数据提取工具&#xff0c;支持从PDF、网页和多格式电子书中提取数据。项目star数&#xff1a;15,059项目fork数&#xff1a;1,105 …

Debezium系列之:Debezium3版本使用快照过程中的指标

Debezium系列之:Debezium3版本使用快照过程中的指标 一、背景二、技术原理三、增量快照四、阻塞快照指标一、背景 使用快照技术的过程中可以观察指标,从而确定快照的进度二、技术原理 Debezium系列之:Debezium 中的增量快照Debezium系列之:Incremental snapshotting设计原理…

datawhale11月组队学习 模型压缩技术2:PyTorch模型剪枝教程

文章目录 一、 prune模块简介1.1 常用方法1.2 剪枝效果1.3 二、三、四章剪枝测试总结 二、局部剪枝&#xff08;Local Pruning&#xff09;2.1 结构化剪枝2.1.1 对weight进行随机结构化剪枝&#xff08;random_structured&#xff09;2.1.2 对weight进行迭代剪枝&#xff08;范…

计算机视觉中的双边滤波:经典案例与Python代码解析

&#x1f31f; 计算机视觉中的双边滤波&#xff1a;经典案例与Python代码解析 &#x1f680; Hey小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个重要技术——双边滤波。双边滤波是一种非线性滤波方法&#xff0c;主要用于图像去噪和平滑&#xff0c;同时保留图像的边…