Spark Structured Streaming实战--使用滑动窗口(Sliding windows)_spark 滑动窗口和计数窗口同时使用-程序员宅基地

技术标签: 实战-Spark Structured Streaming  spark实战  spark  structur stream  spark结构化流  

滑动窗口比翻滚窗口要复杂一些,滑动窗口的窗口之间有重叠的区域,这个区域会被计算两次。那么,为什么要这么设计呢?滑动窗口通常用于流量控制,资源保护等场景,它可以让控制更加平滑。

介绍

顾名思义,该窗口非固定,而是滑动的。在滑动窗口中,元组被分组在一个窗口中,该窗口根据指定的间隔在数据流中滑动。滑动窗口可以包含重叠的数据,一个数据可以属于多个滑动窗口。

可以认为窗口每次的滑动就是产生了一个新的窗口。就需要开始该窗口的计算。当然若前一个窗口还没有计算还会继续计算,所以就会产生一些重叠的区域。关于滑动窗口的详细的原理介绍,可以查看:《窗口基本原理》一文。

使用

  • 基本使用方式

滑动窗口的基本使用方法如下:

from pyspark.sql.functions import explode
from pyspark.sql.functions import split
from pyspark.sql.functions import window

lines = spark.readStream()....load()
words = lines.select(...)

wordCounts = words.groupBy(
    window(words.timestamp, "5 seconds"),
    words.word
).count()
  • 完整例子

在pyspark终端中输入以下代码:

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode
from pyspark.sql.functions import split
from pyspark.sql.functions import window

# 需要添加时间戳选项
lines = spark
    .readStream
    .format("socket")
    .option("host", "localhost")
    .option("port", 10002)
    .option('includeTimestamp', 'true')
    .load()

# 处理数据:可以按自己的逻辑来处理数据
words = lines.select(
    explode(split(lines.value, ' ')).alias('word'),
    lines.timestamp
)

# 定义一个10秒的滑动窗口,每5秒更新一次结果
wordCounts = words.groupBy(
    window(words.timestamp, "10 seconds",5 seconds“),
    words.word
).count().orderBy('window')

# 使用complete模式
# 打印到终端
query = wordCounts
    .writeStream
    .outputMode("complete")
    .format("console")
    .option('truncate', 'false')
    .start()
  • 数据输入

在终端依次不间断输入以下字符串:

[hover@ahi-vm-192-168-4-141 ~]$ nc -lk 10002
this is a
this is b 
this is c
this is d
this is e
that is g
  • 结果输出:
------------------------------------------                                     
Batch: 1
-------------------------------------------
+------------------------------------------+----+-----+
|window                                    |word|count|
+------------------------------------------+----+-----+
|[2020-12-15 03:02:40, 2020-12-15 03:02:50]|is  |1    |
|[2020-12-15 03:02:40, 2020-12-15 03:02:50]|a   |1    |
|[2020-12-15 03:02:40, 2020-12-15 03:02:50]|this|1    |

|[2020-12-15 03:02:45, 2020-12-15 03:02:55]|this|2    |
|[2020-12-15 03:02:45, 2020-12-15 03:02:55]|b   |1    |
|[2020-12-15 03:02:45, 2020-12-15 03:02:55]|is  |2    |
|[2020-12-15 03:02:45, 2020-12-15 03:02:55]|a   |1    |

|[2020-12-15 03:02:50, 2020-12-15 03:03:00]|this|3    |
|[2020-12-15 03:02:50, 2020-12-15 03:03:00]|c   |1    |
|[2020-12-15 03:02:50, 2020-12-15 03:03:00]|d   |1    |
|[2020-12-15 03:02:50, 2020-12-15 03:03:00]|b   |1    |
|[2020-12-15 03:02:50, 2020-12-15 03:03:00]|is  |3    |

|[2020-12-15 03:02:55, 2020-12-15 03:03:05]|is  |3    |
|[2020-12-15 03:02:55, 2020-12-15 03:03:05]|this|3    |
|[2020-12-15 03:02:55, 2020-12-15 03:03:05]|c   |1    |
|[2020-12-15 03:02:55, 2020-12-15 03:03:05]|d   |1    |
|[2020-12-15 03:02:55, 2020-12-15 03:03:05]|e   |1    |

|[2020-12-15 03:03:00, 2020-12-15 03:03:10]|is  |2    |
|[2020-12-15 03:03:00, 2020-12-15 03:03:10]|that|1    |
|[2020-12-15 03:03:00, 2020-12-15 03:03:10]|e   |1    |
+------------------------------------------+----+-----+

从以上例子中可以看到有些输入单词被统计了两次。这些被统计了两次的单词就是滑动窗口的时间段的重合部分。

小结

本文介绍了如何使用滑动窗口来进行单词计数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zg_hover/article/details/113136626

智能推荐

推荐5个好用的视频语音转换成文字方法!必须收藏~-程序员宅基地

文章浏览阅读254次。在日常生活工作学习中,我们经常接触各种涉及到语音的场景,比如开会,上网课,看视频,有些时候我们需要把相关的语音转换成文稿进行使用,那怎么能快速完成语音转文字呢?下面就给大家分享几个好用的语音转文字方法,一起来看看吧~

写给想当程序员的朋友—一个还不太老的普通程序员的体会_做程序员为什么也只能干1年-程序员宅基地

文章浏览阅读1.8w次。软件以程序员为本————《程序员》  谨以此文献给所有想当程序员的朋友 (一) 文章由来及个人经历 我是一名计算机专业的本科毕业生,毕业已经1年多了。毕业后从事的是软件编程工作,经常有其他专业的朋友想从事软件编程工作,向我请教如何,因为我自觉涉行不深,不敢信口开河,无奈朋友信任,我不得不郑重考虑一下这个问题了,来帮助朋友选择和回报朋友的信任。 这也就是此文的由来。 还是先谈谈我个人的经历吧。(_做程序员为什么也只能干1年

使用NFS搭建WEB服务器集群_利用局域网搭建服务器集群-程序员宅基地

文章浏览阅读1.5k次。本文所讲述的是在使用LNMP或者LAMP搭建站点之后,如何部署多台web服务器,并使用NFS服务实现这多台服务器能够同步数据。 有关LNMP建站的相关文档可参考我的这篇博客: 传送门 目录实验环境介绍:NFSNFS参数详解NFS服务器的部署Web集群部署实验结果:实验环境介绍:在做该实验的时候,博主已经搭建好了LNMP的环境,并部署好了一个站点,博主的..._利用局域网搭建服务器集群

C 中的setter和getter_c语言 setter getter-程序员宅基地

文章浏览阅读371次。C 中的setter和getter_c语言 setter getter

程序修改注册表权限-程序员宅基地

文章浏览阅读596次。#include <Windows.h> #include <Aclapi.h> #pragma comment (lib,"Advapi32.lib") void main() { DWORD dwRet; LPSTR SamName = "MACHINE\\SAM\\SAM"; PSECURITY_DESCRIPTOR pSD = NULL; PACL ..._c++ 修改访问注册表的权限

类似查询mysql数据库的查询XML的JS类_查询除了用xml以外还有什么-程序员宅基地

文章浏览阅读514次。一个快捷操作XML数据库的Javascript接口对象,包含select、count、tables、fields等方法,能够像操作mysql等其它数据库一样操作XML数据库。_查询除了用xml以外还有什么

随便推点

js中date日期的使用总结_js getdatenow-程序员宅基地

文章浏览阅读6.7k次,点赞3次,收藏4次。赋某日期为日期类型 new Date(myYear,myMonth,myDate);//当myDate为0时,返回当前月份的上月末日期 当前日期 now new Date() 设置日期分钟为0 now.setMinutes(0) 设置当前日期秒为1 now.setSeconds(1) 当前日期..._js getdatenow

理解EJB_csdn ejb-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏7次。转载: EJB到底是什么,真的那么神秘吗 1. 我们不禁要问,什么是”服务集群”?什么是”企业级开发”? 既然说了EJB 是为了”服务集群”和”企业级开发”,那么,总得说说什么是所谓的”服务 集群”和”企业级开发”吧! 这个问题其实挺关键的,因为J2EE 中并没有说明白,也没有具体的指标或者事例告诉 广大程序员什么时候用EJB什么时候不用。于是大家都产生一些联想,认为EJB”分布式运 算”指_csdn ejb

vue v-model修饰符_vue-model修饰符-程序员宅基地

文章浏览阅读74次。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> &.._vue-model修饰符

主题七 最终的胜利----41.C语言程序员简历编写及面试技巧_c语言程序项目简历怎么学-程序员宅基地

文章浏览阅读582次。面试的一般流程:首先要简历做的好,才能通过简历海选进入第一轮笔试;其次要基础知识扎实,才能过笔试进入第二轮面试环节;最后,面试时自信大方,谈吐得当,get the offer!简历编写简历获取面试资格(符合公司招聘要求,最重要亮点,公司关心你的最强的部分,求职意向明确便于HR分类;HR最关心:工作经历,教育背景(HR可能不懂技术,置顶;技术名词英文化专业化);不同面试环节人_c语言程序项目简历怎么学

[翻译]Swift编程语言——初始化_编程语初始化的过程是什么-程序员宅基地

文章浏览阅读594次。初始化_编程语初始化的过程是什么

安卓渗透测试工具---drozer使用_drozer agent-程序员宅基地

文章浏览阅读1.6k次。目录drozer下载drozer安装drozer使用建立手机端和PC端的连接确定攻击面测试activities exported (容易绕过登陆验证)测试 content provider(易造成数据库泄露,sql注入等问题)利用暴露的content provider进行sql注入从File System-backed Content Providers获取信息测试services exported (权限提升)测试broadcast receivers exported(拒绝服务)drozer下载下载_drozer agent

推荐文章

热门文章

相关标签