Spark Streaming 的 reduceByKeyAndWindow 窗口函数

【Spark实战系列】sparkstreaming 的 reduceByKeyAndWindow 窗口函数的用法详解 今天我们主要来说一下spark中reduceByKeyAndWindow窗口函数的使用方法; 先看一下官网的图片吧: 这个是sparkstreaming提供的窗口计算,允许你在一个滑动的窗口中进行计算,所有这些窗口操作都需要两个参数 -windowLength和slideInterval。(窗口长度-窗口的持续时间,滑动间隔- 执行窗口操作的间隔)比如说我们现在要每隔2秒,统计前3... 阅读详情

Spark Streaming提供了窗口计算,可让您在数据的滑动窗口上应用转换
官方SparkStreaming-window图
一些常见的窗口操作如下。所有这些操作都采用上述两个参数-windowLength(窗口长度)和slideInterval(滑动步长)。

窗口函数描述
window(windowLength,slideInterval)Return a new DStream which is computed based on windowed batches of the source DStream.
countByWindow(windowLength,slideInterval)Return a sliding window count of elements in the stream.
reduceByKeyAndWindow(func,windowLength,slideInterval,[ numTasks ])Return a new single-element stream, created by aggregating elements in the stream over a sliding interval using func. The function should be associative and commutative so that it can be computed correctly in parallel.
reduceByKeyAndWindow(func,invFunc,windowLength, slideInterval,[ numTasks ])When called on a DStream of (K, V) pairs, returns a new DStream of (K, V) pairs where the values for each key are aggregated using the given reduce function func over batches in a sliding window. Note: By default, this uses Spark’s default number of parallel tasks (2 for local mode, and in cluster mode the number is determined by the config property spark.default.parallelism) to do the grouping. You can pass an optional numTasks argument to set a different number of tasks.
countByValueAndWindow(windowLength, slideInterval,[ numTasks ])When called on a DStream of (K, V) pairs, returns a new DStream of (K, Long) pairs where the value of each key is its frequency within a sliding window. Like in reduceByKeyAndWindow, the number of reduce tasks is configurable through an optional argument.

reduceByKeyAndWindow 窗口函数有两个重载方法

一般情况下,我们会写

//reduceByKeyAndWindow(func,windowLength,slideInterval,[ numTasks ])

val df = socketDStream // 从socket 得到值
          .flatMap(_.split(" "))
          .map((_, 1))
          .reduceByKeyAndWindow(
              (_: Int) + (_: Int),
              Seconds(3),
              Seconds(2))

也就是最上面官方给出的那种图,每 2 秒,统计前3秒的数据(当前时间点的前3秒),此时此刻我们看到,当前窗口和前一个窗口重叠了一部分数据,导致 time3 会被计算两次,要想 time3不被计算两次,我们就要用到 reduceByKeyAndWindow 的重载方法:

reduceByKeyAndWindow(func,invFunc,windowLength, slideInterval,[ numTasks ])

我们先看看官方给出的函数描述,翻译过来就是说:

该重载方法比 reduceByKeyAndWindow(func,windowLength,slideInterval,[ numTasks ]) 更加高效

原因是,其中每个窗口的 reduce 值,使用前一个窗口的 reduce 值递增计算,得到当前前窗口的 reduce 值,然后减去 前一个窗口 失效的值

也就是说,计算规则变成了:

window1 = time1 + time2 + time3
window2 = window1 + time3 + time 4 - time1 - time2 => time3 + time4 + time5

那么实现起来就是

val df1 = socketDStream
          .flatMap(_.split(" "))
          .map((_, 1))
          .reduceByKeyAndWindow(
              (_: Int) + (_: Int),
              (_: Int) - (_: Int),
              Seconds(3),
              Seconds(2))

其中第一个函数值 _+_ 是 对滑动后窗口中新的数据(time4, time5)进行累加统计
第二个函数 _-_是对滑动后,前一个窗口过时的数据(time1,time2)进行减去统计


看一节完整案例:从 socket 接受数据做 wordCount

package apache

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.dstream.ReceiverInputDStream

/**
  * @author kino
  * @version 1.0.0
  */
object ReduceByKeyWindow2 {
    def main(args: Array[String]): Unit = {
        val ssc = new StreamingContext(
            new SparkConf()
              .setMaster("local[2]")
              .setAppName("reduceByWindow"),
            Seconds(1))
        ssc.checkpoint("./reduceByKeyWindowPoint")

        val socketDStream: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop102", 9999)

        val df = socketDStream
          .flatMap(_.split(" "))
          .map((_, 1))
          .reduceByKeyAndWindow(
              (_: Int) + (_: Int),
              Seconds(3),
              Seconds(2))

        val df1 = socketDStream
          .flatMap(_.split(" "))
          .map((_, 1))
          .reduceByKeyAndWindow(
              (_: Int) + (_: Int),
              (_: Int) + (_: Int),
              Seconds(3),
              Seconds(2))

        df.print
        df1.print
        ssc.start
        ssc.awaitTermination
    }
}
Spark(42) -- SparkStreaming -- reduceByKeyAndWindow 函数详解 1. 图解 2. 代码演示 3. 执行步骤 4. window 函数补充(窗口函数) 5. 集成 SparkSQL补充 5.1 案例:仅统计处理时间内数据 5.2 有状态统计 阅读详情

相关推荐

Git系列(一)、Git基础教程【建议收藏】

Git一、Git简介1.1、什么是Git? 一、Git简介 1.1、什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不用服务器端软件支持。 .........

一宿君 4万+

spark算子:滑动窗口函数reduceByKeyAndWindow的使用

1.reduceByKeyAndWindow这个算子也是lazy的,它用来计算一个区间里面的数据,如下图:截图自官网,例如每个方块代表5秒钟,上面的虚线框住的是3个窗口就是15秒钟,这里的15秒钟就是窗口的长度,其中虚线到实线移动了2个方块表示10秒钟,这里的10秒钟就表示每隔10秒计算一次窗口长度的数据举个例子: 如下图我是这样理解的:如果这里是使用窗口函数计算wordcount 在第一个窗口(...

挖矿的小强的博客 6000

双击文件夹弹窗“找不到应用程序”,但是右键点击打开可以

此电脑、回收站、c、d、f盘、控制面板、任意文件夹等都没有办法双击打开。 右键中包含“使用filemanager打开”,是由于FileManager卸载残留导致的。 懒人专用附件 下载解压上面附件,双击导入可以清理FileManager软件残留 参考: 双击此电脑出现找不到应用程序,但是右键点击可以-其他-优快云问答https://ask.youkuaiyun.com/questions/7631439 电脑上的文件夹双击都提示找不到应用程序,但是右击打开就能打开,该怎么解决? - 知乎 (z

webmasterqpwou的博客 1万+

Spark Streaming使用window函数与reduceByKeyAndWindow实现一定时间段内读取Kafka中的数据累加;reduceByKeyAndWindow函数的两种使用方式

使用window函数实现时间段内数据累加 import kafka.serializer.StringDecoder import org.apache.spark.SparkConf import org.apache.spark.streaming.dstream.DStream import org.apache.spark.streaming.kafka.KafkaUtils import...

蚂蚁 1039

DrawCall、Batches、SetPassCalls的区别和联系

一、DrawCall、Batches、SetPassCalls的基本理解 我们先从图形渲染的角度对这些概念做一个基本的理解。 1.1 DrawCall DrawCall实际上指的是一次图形渲染接口的调用,比如OpenGL的glDrawArrays或者glDrawElements的一次调用,以及DirectX的DrawPrimitive或者DrawIndexedPrimitive。因此,DrawCall可以简单理解为一次渲染指令调用。 1.2 Batches 我们知道,在调用DrawCall之前,需要设置渲染

远行's Blog 6377

windows10下Boost的安装与初试

https://blog.youkuaiyun.com/s_lisheng/article/details/72871218 https://blog.youkuaiyun.com/yockie/article/details/8856190?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-12.vipsorttest&depth_1-utm_source=dis

焦露的博客 6393

Spark Streaming:reduceByKeyAndWindow、foreachRDD算子

基于Window窗口的转化操作 基于窗口的操作会在一个比StreamingContext 的批次间隔更长的时间范围内,通过整合多个批次的结果,计算出整个窗口的结果。 滑动窗口转换操作的计算过程如下图所示,我们可以事先设定一个滑动窗口的长度(也就是窗口的持续时间),并且设定滑动窗口的时间间隔(每隔多长时间执行一次计算),然后,就可以让窗口按照指定时间间隔在源DStream上滑动,每次窗口停放的位置上...

Yage的博客 764

Python + DeepSeek 完美结合:本地部署提效指南

随着生成式 AI 和深度学习技术的快速发展,如何将智能搜索工具与本地部署结合以提升效率成为了许多企业和开发者关注的重点。DeepSeek 是一款开源的智能搜索框架,结合 Python 的灵活性,能够实现高效、可靠的本地部署方案。本文将介绍如何通过 Python 和 DeepSeek 的完美结合,实现本地化部署并提升工作效率。通过将 Python 与 DeepSeek 结合,可以快速实现语义搜索的本地化部署,确保数据安全的同时提升工作效率。文件可直接作为 DeepSeek 的输入数据。

weixin_44872675的博客 1万+

Spark Streaming 实战 reduceByKeyAndWindow

reduceByKeyAndWindow : 窗口函数 图解 滑动窗口转换操作的计算过程如下图所示, 我们可以事先设定一个滑动窗口的长度(也就是窗口的持续时间),并且设定滑动窗口的时间间隔(每隔多长时间执行一次计算), 比如设置滑动窗口的长度(也就是窗口的持续时间)为24H,设置滑动窗口的时间间隔(每隔多长时间执行一次计算)为1H 那么意思就是:每隔1H计算最近24H的数据 ...

最慢的步伐不是跬步,而是徘徊;最快的脚步不是冲刺,而是坚持 8291

机械臂TCP标定实战:从四点法到六点法的精度跃迁

本文详细解析机械臂TCP标定技术,从基础的四点法到高精度的六点法实现精度跃迁。通过工具坐标系与基坐标系的转换原理,结合实战案例展示六点法如何将装配合格率提升至99.5%,并分享环境控制、操作技巧等提升标定精度的关键要素。

weixin_29038345的博客 894

电动汽车欧标直流充电标准解析

电动汽车和电动汽车充电市场是动态发展的,欧洲也正在努力部署基础设施,以支持欧洲快速增长和多样化的电动汽车充电需求。

网络安全的研究者、新能源行业的追求者 7616

SparkStreaming操作实战代码(整合kafka ,窗口函数)

Spark Streaming实战(wordcount) package day0414 import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream} import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.stream...

登峰造极胡子球手 2678

CAN总线介绍及硬件设计

1. CAN是什么 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议。 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很 多,线束的数量也随之增加。为适应“减少线束的数量”、“......

sinat_15677011的博客 9991

Spark Streaming之窗口函数和状态转换函数

流处理主要有3种应用场景:无状态操作、window操作、状态操作。

修行修心 3947

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SparkStream之Transformation类算子

一、概述 SparkStreaming中的算子分为两类,一类是Transformation类算子,一类是OutPutOperator类算子。 Transformation类算子updateStateByKey,reduceByKeyAndWindow,transform OutPutOperator类算子print,foreachRDD,saveAsTextFile 二、transfo...

lixinkuan的博客 1005

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Chapter 7:Spark Streaming

Spark中流处理的相关知识

Justicer_Young的博客 788

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SparkStreaming---窗口函数

文章目录一、窗口函数二、transform 一、窗口函数 package window import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord} import org.apache.spark.SparkConf import org.apache.spark.streaming.dstream.{DStream, InputDStream} import org.apache.spark.streaming.kaf

shall潇の菜园 511

Spark窗口计算

Spark窗口计算 依然使用wordcount的demo,这次不使用reduceByKey,而是reduceByKeyAndWindow。在reduceByKey的基础上,增加对窗口的限制。 代码 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.streaming.{Seconds, StreamingContext} object win { def main(args: Array[String])

weixin_45264992的博客 338

使用idea编写SparkStreaming_reduceByKeyAndWindow

使用idea编写SparkStreaming_reduceByKeyAndWindow 窗口函数: 代码演示: package cn.itcast.streaming import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream} import org.apache.spark.streaming.{Secon...

汉子一枚 1157

高效的reduceByKeyAndWindow算子

总的来说SparkStreaming提供这个方法主要是出于效率考虑。 比如说我要每10秒计算一下前15秒的内容,(每个batch 5秒), 可以想象每十秒计算出来的结果和前一次计算的结果其实中间有5秒的时间值是重复的。 那么就是通过如下步骤 1. 存储上一个window的reduce值 2.计算出上一个window的begin 时间到 重复段的开始时间的reduce 值 =》 oldRDD 3.重...

学海无涯 3574

SparkStreaming中的Window操作(driver、executor的执行顺序以及 foreach 及 foreach partition 的效率)

SparkStreaming中的Window操作窗口函数定义1. 创建topic2. 开启生产者topic3. window(windowLength, slideInterval)3.1 测试4. countByWindow(windowLength,slideInterval)4.1 测试5. countByValueAndWindow(windowLength,slideInterval, [numTasks])5.1 测试6. reduceByWindow(func,windowLength,

Mr_Bright的博客 633

sparkstreaming的reduceByKeyAndWindow窗口函数的用法

今天我们主要来说一下spark中reduceByKeyAndWindow窗口函数的使用方法; 先看一下官网的图片吧: 这个是sparkstreaming提供的窗口计算,允许你在一个滑动的窗口中进行计算,所有这些窗口操作都需要两个参数 -windowLength和slideInterval。(窗口长度-窗口的持续时间,滑动间隔- 执行窗口操作的间隔) 比如说我们现在要每隔2秒,统计前...

qq_43193797的博客 930

DStream操作实战(三)

SparkStreaming开窗函数reduceByKeyAndWindow 实现单词计数 1、代码实现 package cn.cheng.spark import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream} import org.apache.spark.streaming.{Seconds,...

Running_Tiger的博客 994

SparkSteaming进行UV统计

需求:每个一分钟统计一次最近一个小时UV    思考过程:由于UV是矢量数据,不能每分钟的UV最一个统计,在基于每分钟的计算结果进行累加计算出最近一个小时用户量的求和。 SparkStreaming提供的窗口函数,比较知名的reduceByKeyAndWindow开窗函数,该函数一般用于对标量数据的统计,例如,用户访问量、点击量等;通过对该算子源代码解读,了解到该算子通过重叠两个窗口之间的统计

andyliuzhii的专栏 2875

DStream操作实战(四)

SparkStreaming开窗函数统计一定时间内的热门词汇 1、代码实现 package cn.cheng.spark import org.apache.spark.rdd.RDD import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream} import org.apache.spark.st...

Running_Tiger的博客 1235

SparkStreaming编程实现

1.产生实时流 nc -lk 1234 hello hadoop word hello spark hbase hive hello china ​ 2.MyNetworkWordCount.scala package day10 import org.apache.log4j.{Level, Logger} import org.apache.spark.SparkConf i...

浪淘沙 436
上一篇: Spark源码分析(一):Master 启动
下一篇: zsh 各类操作
丶kino丶
博客等级 码龄10年 32粉丝 58原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值