Spark中的Window滑动窗口之热点搜索词滑动统计!

通过Spark Streaming的window操作实战模拟热点搜索词案例实战 本博文主要内容包括:1、在线热点搜索词实现解析 2、SparkStreaming 利用reduceByKeyAndWindow实现在线热点搜索词实战一:在线热点搜索词实现解析背景描述:在社交网络(例如微博),电子商务(例如京东),热搜词(例如百度)等人们核心关注的内容之一就是我所关注的内容中,大家正在最关注什么或者说当前的热点是什么,这在市级企业级应用中是非常有价值,例如我们关心过去30分钟大家正 阅读详情
package com.bynear.spark_Streaming;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import scala.Tuple2;

import java.util.List;

/**
 * 2018/5/15
 * 14:28
 * 热点搜索词滑动统计,每隔10s,统计最近60s的搜搜词的搜索频次,并打印出排名最靠前的3个搜索词以及出现的次数。
 */
public class WindowOprition {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("window").setAppName("local[2]");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        JavaStreamingContext jssc = new JavaStreamingContext(jsc, Durations.seconds(5));
        /**搜索日志的格式
         * leo hello
         * tom world
         */
        JavaReceiverInputDStream<String> searchLogsDStream = jssc.socketTextStream("localhost", 9999);
        /**将搜索日志进行转换,只搜索一个词即可
         */
        JavaDStream<String> searchWordsDStream = searchLogsDStream.map(new Function<String, String>() {
            @Override
            public String call(String searchLog) throws Exception {
//                return searchLog.split(" ")[1];
                return searchLog;
            }
        });
//        将搜索词映射为(word,1)的Tuple格式
        JavaPairDStream<String, Integer> searchWordPairDStream = searchWordsDStream.mapToPair(new PairFunction<String, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(String searchWord) throws Exception {
                return new Tuple2<String, Integer>(searchWord, 1);
            }
        });
        /**
         *针对(word,1)的Tuple格式的DStream,执行reduceByKeyAndWindow,滑动窗口操作
         *第二个参数为,窗口长度,60s
         *第三个参数为,滑动间隔,10s
         * 也就是说,每个10s,将最近的60s的数据,作为一个窗口,进行内部的RDD聚合,然后统一对一个RDD进行后续的计算
         * 所有,这里的意思是,之前的searchWordPairDStream为止,其实都不会立即进行计算的
         * 而只是放在那里,然后,等到我们的滑动间隔到了以后,10s到了,会将之前的60s的RDD,||||||因为一个batch的间隔是5s,所以之间的60s
         * 就有12个RDD|||||||,给聚合起来,然后 统一执行reduceByKey操作,
         * 所以这里的reducebyKeyAndWindow,是针对每个窗口执行计算的,而不是针对某个DStream中的RDD
         */
        JavaPairDStream<String, Integer> searchWordCountsDStream = searchWordPairDStream.reduceByKeyAndWindow(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer num1, Integer num2) throws Exception {
                return num1 + num2;
            }
        }, /*窗口长度*/Durations.seconds(60),/*滑动间隔*/ Durations.seconds(10));
        //到这里为止,就可以做到,每隔10s,出来之前60s的收集的单词的统计次数
        //只想transform操作,因为,一个窗口,就是一个60s的数据,会变成一个RDD,然后,针对这一个RDD
        //根据每个搜索词出现的次数  进行排序,然后获取排名前三名的热点词
        JavaPairDStream<String, Integer> finalDStream = searchWordCountsDStream.transformToPair(new Function<JavaPairRDD<String, Integer>, JavaPairRDD<String, Integer>>() {
            @Override
            public JavaPairRDD<String, Integer> call(JavaPairRDD<String, Integer> searchWordCountsRDD) throws Exception {
                JavaPairRDD<Integer, String> countSearchWordsRDD = searchWordCountsRDD.mapToPair(new PairFunction<Tuple2<String, Integer>, Integer, String>() {
                    //                映射为(number,word)
                    @Override
                    public Tuple2<Integer, String> call(Tuple2<String, Integer> tuple) throws Exception {
                        return new Tuple2<Integer, String>(tuple._2, tuple._1);
                    }
                });
//                根据number 作为key 进行排序
                JavaPairRDD<Integer, String> sortedCountSearchWordsRDD = countSearchWordsRDD.sortByKey(false);
//                映射为(word,number)
                JavaPairRDD<String, Integer> sortedSearchWordCountsRDD = sortedCountSearchWordsRDD.mapToPair(new PairFunction<Tuple2<Integer, String>, String, Integer>() {
                    @Override
                    public Tuple2<String, Integer> call(Tuple2<Integer, String> tuple) throws Exception {
                        return new Tuple2<String, Integer>(tuple._2, tuple._1);
                    }
                });
//                通过take(n) 获取排序后 前n个热点词
                List<Tuple2<String, Integer>> hogSearchWordCounts = sortedSearchWordCountsRDD.take(3);
                for (Tuple2<String, Integer> wordCount : hogSearchWordCounts) {
                    System.out.println(wordCount._1 + ":" + wordCount._2);
                }
                return searchWordCountsRDD;
            }
        });
        finalDStream.print();


        jssc.start();
        jssc.awaitTermination();
        jssc.stop();
        jsc.close();
    }
}

执行结果:::::(代码中有部分调整,输入的日志格式有 (name word) 修改成了只输入一个关键词word,便于测试! )
nc -lk 9999 窗口 不断输入内容
运行窗口,每隔10s统计一下 之前60s内热点词出现的热点词的前三名:
统计出来的结果不断在变化! 因为

0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160

0~10 输入 1 2 2 3 3 3 4 4 4 5 5 5 5 5 6 6 6
显示为(1,1)(2,2)(3,3)(4,3)(5,5)(6,3){未排序}
10~20 输入 1 2 3
显示 (1,2)(2,3)(3,4)(4,3)(5,5)(6,3){未排序}
20~30输入 1 2 3
显示 (1,3)(2,4)(3,5)(4,3)(5,5)(6,3){未排序}
30~40 输入 1 2 3
显示 (1,4)(2,5)(3,6)(4,3)(5,5)(6,3){未排序}
40~50 输入 1 2 3
显示 (1,5)(2,6)(3,7)(4,3)(5,5)(6,3){未排序}
50~60 输入 1 2 3
显示 (1,6)(2,7)(3,8)(4,3)(5,5)(6,3){未排序}
60~70 输入 hello word
此时0~10已经不再60s内,所有0~10内输入的单词 被清除掉了
00~10的输入1 2 2 3 3 3 4 4 4 5 5 5 5 5 6 6 6
50~60的显示(1,6)(2,7)(3,8)(4,3)(5,5)(6,3){未排序}
最后的显示为 (1,5)(2,5)(3,5)(hello,1)(word,1)
70~80 输入 zjs lt
此时 10~20的数据不存在了
10~20的输入 1 2 3
60~70的显示 (1,5)(2,5)(3,5)(hello,1)(word,1)
最终的显示为 (1,4)(2,4)(3,4)(hello,1)(word,1)(zjs,1)(lt,1)

以此类推………………

如何用 ABAP 以程序方式把指定表项写入 Transport Request 本文探讨了在SAP系统中运输自定义配置表数据时如何确保主表和相关文本表数据同步运输的问题。文章分析了两种实现方案:一是直接操作CTS表结构(E071和E071K)手动添加运输条目,二是使用SOBJ对象类型自动推导依赖关系。重点阐述了第一种方法的实现细节,包括如何正确拼接表键值到TABKEY字段,并提供了示例代码说明如何将ZXA_HEADER主表和ZXA_HEADERT文本表数据同时加入运输请求。文章特别指出在全球化交付场景中,文本表缺失会导致界面显示异常,强调理解底层运输机制对解决此类问题的重要性。 阅读详情

相关推荐

RK3588与银河麒麟V10 SP1 2403深度适配:国产化硬件与操作系统的完美融合

本文深入探讨了RK3588处理器与银河麒麟V10 SP1 2403操作系统的深度适配,展示了国产化硬件与操作系统的完美融合。通过性能验证和实际应用测试,证明了这套组合在多媒体处理、AI推理和日常办公中的卓越表现,实现了完全自主可控的计算平台。

weixin_29194255的博客 250

SparkStreaming窗口入门

window操作就是窗口函数。Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,这3秒内的3个RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动窗口计算。所以每个滑动窗口操作,都必须指定两个参数,窗口长度以及滑动间隔,而且这两个参数值都必须是batch间

鸭梨的博客 825

【论文阅读】LIME:Low-light Image Enhancement via Illumination Map Estimation(笔记最全篇)

文章目录AbstractIntroductionContributionMethodSpeed-up Method(1):ALM子问题 T子问题 G子问题 Z和μ\muμSpeed-up Method(2):权重变量实验conclusion 今天要整理的一篇论文是使用传统的方法解决低照度的问题,Guo等人于2016年发表在IEEE上,论文《LIME:Low-light Image Enhance...

florrie 2万+

hive、spark 窗口滑动获取数据集

hive、spark 窗口滑动获取数据集

qq_19072921的博客 1377

C# 8. 在新窗口中使用chart控件波形移动显示

1. 添加新窗口 在Form1中新建button控件,名称为buttonStartWaveDisp,这样单击就能调出Form2窗口 在Form1中增加如下: private void buttonStartWaveDisp_Click(object sender, EventArgs e) { if((form2 == null) || (form2.IsDisposed == true)) { form2 = new Form2();

TrueLink的博客 1432

别再只看图了!代谢组学OPLS-DA分析,R2Y和Q2Y到底怎么看才不踩坑?

本文深入解析代谢组学OPLS-DA分析中的关键指标R2Y和Q2Y,揭示如何避免过拟合陷阱。通过详细解读模型解释能力(R2Y)和预测能力(Q2Y),结合置换检验方法,提供完整的模型评估流程与实战建议,帮助研究者获得可靠的分析结果。

weixin_42638178的博客 196

13.window滑动窗口以及热点搜索词滑动统计案例实战

window滑动窗口 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,这3秒内的3个RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动

认知 行动 坚持 1308

AD/Protel老手才知道的PCB过孔查看技巧:3分钟分清通孔、盲孔和埋孔

本文为PCB设计工程师提供了在Altium Designer/Protel中快速鉴别通孔、盲孔和埋孔的实用技巧。通过层叠管理器、高级筛选工具和实战五步法,帮助用户在3分钟内精准识别过孔类型,提升设计效率和电路性能。特别适合处理高密度HDI板卡中的复杂过孔布局。

weixin_29164497的博客 578

大数据项目实战:热点搜索词实时滑动统计

热点搜索词滑动统计 每隔60秒钟,统计最近300秒钟的搜索词的搜索频次,并打印出排名最靠前的5个搜索词以及出现次数。(60秒为数据更新频率,300秒为更新数据的时间范围。) 普通SparkStreaming处理方式,如果将时间间隔设置成300s,无法每隔60s输出一次结果;如果将时间间隔设置成300s,同时使用updatebyKeyState,那么统计的是持续的累加结果,无法做到统计300s之内的...

weixin_37736146的博客 1284

硬核干货|C#+EtherCAT协议:高精度多轴伺服运动控制通信实战

本文摘要: 文章聚焦工业自动化领域多轴伺服运动控制的高精度与实时性需求,基于C#与EtherCAT协议实现完整解决方案。EtherCAT凭借微秒级同步、分布式架构等优势成为首选,而C#通过优化GC策略和实时线程可满足工业控制要求。文章从工程落地角度,详细拆解EtherCAT的PDO/SDO通信机制与多轴同步控制逻辑,提供完整的C#代码实现(主站初始化、伺服配置、运动控制等),所有代码均通过汇川/松下伺服实测验证。核心亮点包括:纯C#原生开发、工业现场高频问题解决方案、硬件适配指南,帮助开发者快速掌握高精度多

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 587

LDRA Testbed软件静态分析_操作指南

从本文起,将开始LDRA Testbed(TBrun)教程的系列文章,包括软件静态分析、单元测试、集成测试,以及基于Testbed的自动化工具开发、持续集成、常见问题解答等。LDRA公司是专业的软件测试工具与测试技术、咨询服务提供者,其总部位于英国利物浦。其旗舰产品Testbed/TBrun功能全面、易于使用,不仅适合于主机平台软件测试,同时适合于嵌入式软件测试。不仅能进行软件静态测试,还能进行软件单元测试、软件集成测试,在白盒测试领域运用比较广泛。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1万+

获取设备信息相关

QQ判断浏览器环境:

weixin_43294560的博客 174

ESD防护设计宝典(二十三):ESD与EOS失效差异分析

ESD和EOS是电子制造业面临的两大挑战,随着电子产品向更高集成度、更低工作电压和更高工作频率发展,这一问题将更加突出。根据美国军方上世纪八十年代与可靠性分析中心(RAC)共同建立的现场失效返回程序(FFRP)统计数据,产品现场返回中EOS占比高达46%,而ESD仅占6%,另有6%的案例难以区分是EOS还是ESD。

m0_56451176的博客 322

92、Spark Streaming之window滑动窗口以及热点搜索词滑动统计案例实战

window滑动窗口 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,这3秒内的3个RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动窗口...

ZJ__ZFH的博客 1517

jre9下载 jdk9

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spark Streaming之window滑动窗口详解

window滑动窗口 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行 计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作 为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,这3 秒内的3个RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动窗口 计算。所以每个滑动窗口操作,都必须指定两个参数,窗口长度以及滑动间隔,而且这两个参数 值都必须是batch

蔡政洁的博客 2487

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spark-Streaming之window滑动窗口应用

Spark-Streaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。

Ganymede的Hadoop世界 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

57、Spark Streaming: window滑动窗口以及热点搜索词滑动统计案例

一、window滑动窗口 1、概述 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据, 会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算, 这3秒内的3个RDD会被聚合起来进行处理,然后过了两秒...

weixin_30830327的博客 141

Spark Streaming中window滑动窗口的应用

Spark Streaming中window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。 如官网图例中所示,就是对每三秒钟的数据执行一次滑动窗口计算,这3秒内的3个RDD会被聚合起来进行处理,然后过...

Running-小猛的博客 892

Spark-Streaming的window滑动窗口及热点搜索词统计案例

Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会作为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,这3秒内的3个RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动窗口计算。所以每个滑动窗口操

ZMC921的博客 1159

Spark Streaming-window滑动窗口以及热点搜索词滑动统计案例实战

Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD作为window DStream的一个RDD。比如下图中,就是对每三秒钟的数据执行一次滑动窗口计算,这3秒内的3个RDD会被聚合起来进行处理,然后过了两秒钟,又会对最近三秒内的数据执行滑动窗口计算。所以每个滑动窗口操作,...

上海一九四三 1078

Spark Streaming transform以及广告计费日志实时黑名单过滤+window滑动窗口以及热点搜索词滑动统计...

一.transform以及广告计费日志实时黑名单过滤案例实战 transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,DStream API中,并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 D...

Transkai 149

Spark Streaming Window窗体相关操作

转自:https://www.cnblogs.com/duanxz/p/4408789.html Spark Streaming之五:Window窗体相关操作 SparkStreaming之window滑动窗口应用,SparkStreaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD...

sunshingheavy的专栏 356

spark从入门到放弃五十一:Spark Streaming(11)window 滑动窗口

1. 简介Spark Streaming 提供了滑动窗口的操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次落在窗口里面的RDD 数据,会被集合起来,然后生成新的RDD 会作为windows DStream 的一个RDD ,例如对每三秒钟执行一次滑动窗口计算。所以每个滑动窗口的操作,都必须只当两个参数,窗口的长度,以及滑动间隔,而且这两个参数都必须是batch 间隔的整

u012957549的博客 6105

spark streaming -基于滑动窗口的热点搜索词实时统计

本文章通过企业真实案例,完成基于搜索词的实时统计功能import java.util.List; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.function.Function; import org.apache...

贾红平 727

Spark Streaming:reduceByKeyAndWindow、foreachRDD算子

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

Yage的博客 764
上一篇: sql基本命令整理
下一篇: 基于持久化的wordcount程序 foreachRDD
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值