Day15—热点搜索词统计

一、要求

根据用户上网的搜索记录对每天的热点搜索词进行统计,以了解用户所关心的热点话题。
要求完成:统计每天搜索数量前3名的搜索词(同一天中同一用户多次搜索同一个搜索词视为1次)。

二、数据

在这里插入图片描述

三、配置scala环境

1.下载scala插件

Scala插件的安装有两种方式:在线与离线。我们学习在线安装方式。
启动IDEA,在欢迎界面中选择Configure→Plugins命令,搜索scala进行下载

2.配置scala环境

下载后的scala进行环境配置
在Project Settings->Libraries中添加下载好的Scala
在这里插入图片描述

3.创建scala class

在这里插入图片描述
在这里插入图片描述

4.编写scala代码

package org.exampleimport org.apache.spark.rdd.RDD
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types._
import scala.collection.mutable.ListBufferobject keywords {def main(args: Array[String]): Unit = {//构建SparkSession// 构建SparkSessionval spark = SparkSession.builder().appName("YourAppName") // 设置应用程序的名称,显示在Spark UI中.master("local[*]")    // 设置Spark应用程序运行的主节点和资源.getOrCreate()         // 创建或获取已存在的SparkSession对象//读取数据val linesRDD: RDD[String] = spark.sparkContext.textFile("data/keywords.txt")// 使用map算子操作转换RDD中的每个元素val transformedRDD = linesRDD.map(line => {val fields = line.split(",") // 按逗号分割每行数据val date = fields(0) // 日期val user = fields(1) // 用户val keyword = fields(2) // 搜索词((date, keyword), user) // 结果创建一个新的元组,其中包含键和值})//根据关键词进行分组val groupedBy = transformedRDD.groupByKey() //将时间和搜索词相等的(键相等)划分为一组// 去除每个分组中的重复用户名称val distinctUsersPerGroup = groupedBy.map {case ((date, keyword), users) => ((date, keyword), users.toSeq.distinct)}// 使用map操作来转换RDD中的每个元素,计数val userCountsRDD = distinctUsersPerGroup.map {case ((date, keyword), users) => ((date, keyword), users.size)}val result = userCountsRDD.collect()println(result.mkString("\n"))val rowRDD: RDD[Row] = userCountsRDD.map(line => {Row(line._1._1, //日期line._1._2, //关键词line._2.toInt //搜索次数)})//构建DataFrame元数据val structType = StructType(Array(StructField("date", StringType, true),StructField("keyword", StringType, true),StructField("times", IntegerType, true)))//将RDD[Row]转为DataFrameval df = spark.createDataFrame(rowRDD, structType)//使用开窗函数取每一天的搜索前3名df.createTempView("hot_times") //创建临时视图//执行SQL查询spark.sql("select date,keyword,times,rank  from " +"(select date,keyword,times," +"row_number() over (partition by date order by times desc) rank " +"from hot_times) t " +"where t.rank<=3").show()}
}

5.运行结果

在这里插入图片描述

二、在Xshell中运行

总体流程

代码类似于上图
1.读取文件
val rdd = sc.textFile("file:///root/data/keywords.txt")
在这里插入图片描述
2.使用map算子,转换RDD中的每个元素

val rdd2 = rdd.map(line => {val fields = line.split(",") // 按逗号分割每行数据val date = fields(0)         // 日期val user = fields(1)         // 用户val keyword = fields(2)      // 搜索词((date, keyword), user)     // 创建一个新的元组,其中包含键和值})

在这里插入图片描述
3.根据关键词进行分组
将时间和搜索词相等的(键相等)划分为一组

val rdd3GBy= rdd2.groupByKey()

在这里插入图片描述

4.去除重复的值
val rdd4 =rdd3GBy.map { case ((date, keyword), users) => ((date, keyword), users.toSeq.distinct) }

在这里插入图片描述
5.使用map操作来转换RDD中的每个元素,计数

val rdd5 = rdd4.map {case ((date, keyword), users) => ((date, keyword), users.size)}

6.导入必要的包
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types._
import org.apache.spark.sql.{Row, SparkSession}

7.在Apache Spark中,SparkSession 是一个核心对象,用于与Spark交互。它是执行Spark应用程序的入口点,负责创建DataFrame和Dataset,以及读写数据。

    val rowRDD: RDD[Row] = rdd5.map(line => {Row(line._1._1, //日期line._1._2, //关键词line._2.toInt //搜索次数)})

8.这段Scala代码是在使用Apache Spark的RDD(弹性分布式数据集)API来处理文本数据。

    val structType = StructType(Array(StructField("date", StringType, true),StructField("keyword", StringType, true),StructField("times", IntegerType, true)))

9.将RDD[Row]转为DataFrame

val df = spark.createDataFrame(rowRDD, structType)

10.使用开窗函数取每一天的搜索前3名
df.createTempView("hot_times") //创建临时视图

//执行SQL查询
spark.sql("select date,keyword,times,rank  from " +"(select date,keyword,times," +"row_number() over (partition by date order by times desc) rank " +"from hot_times) t " +"where t.rank<=3"
).show()

结果展示

在这里插入图片描述

小结

我们本次学习了使用spark sql来编写一个代码完成统计。在本次学习中,我们探索了如何利用Apache Spark SQL的强大功能来编写代码,以完成数据统计任务。通过Spark SQL,我们能够以一种声明式的方式处理数据集,使得数据分析变得更加直观和高效。我们学习了如何创建SparkSession,执行SQL查询,以及使用DataFrame API进行数据转换和分析。这些技能对于处理大规模数据集至关重要,能够帮助我们快速得到所需的统计结果。通过实践,我们发现Spark SQL不仅简化了代码编写,还提高了数据处理的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站制作和推广

在当今数字化时代&#xff0c;拥有一个网站对于企业的发展和推广来说是至关重要的。网站既可以作为一个企业的形象展示&#xff0c;也可以作为一个销售渠道&#xff0c;更可以作为一个品牌传播的平台。在本文中&#xff0c;我们将讨论网站制作和推广的重要性&#xff0c;以及一…

08较成功的降低干扰获得较好的波形

08较成功的降低干扰获得较好的波形 波形数据当前数据调整后的数据后续 结语其他以下是废话 试验&#xff0c;本身就是一个摸索的过程&#xff0c;在上一阶段的试验中&#xff0c;我们优化了采集装置&#xff0c;更换了导电性较好的电极。 目前数据美观程度较之前提升了不少&…

ViT:3 Compact Architecture

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-27含并行连结的网络GoogLeNet

27含并行连结的网络GoogLeNet import torch from torch import nn from torch.nn import functional as F import liliPytorch as lp import matplotlib.pyplot as pltclass Inception(nn.Module):# c1--c4是每条路径的输出通道数def __init__(self, in_channels, c1, c2, c3, …

【kaggle数据集无法下载解决办法】

kaggle数据集无法下载的解决办法 当我们在做机器学习相关问题的时候&#xff0c;需要到kaggle网站上下载数据集&#xff0c;但是很多时候速度很慢或者连接超时等问题&#xff0c;此时解决办法如下&#xff1a; 在本地安装Kaggle API包 打开终端输入如下指令&#xff1a; pip i…

vscode使用内置插件断点调试vue2项目

1、首先项目中要开启source-map 在vue.config.js 文件中 module.exports {configureWebpack: {devtool: process.env.NODE_ENV ! "production" ? "source-map" : ,} }2、项目根目录新建.vscode/launch.js文件 {"configurations": [{"ty…

解析JavaScript中逻辑运算符和||的返回值机制

本文主要内容&#xff1a;了解逻辑运算符 &&&#xff08;逻辑与&#xff09;和 ||&#xff08;逻辑或&#xff09;的返回值。 在JavaScript中&#xff0c;逻辑运算符 &&&#xff08;逻辑与&#xff09;和 ||&#xff08;逻辑或&#xff09;的返回值可能并不总…

浏览器提升编译速度小技巧(一)- 防病毒排除

1.引言 在Chrome开发过程中&#xff0c;编译速度是影响开发效率的关键因素之一。编译一个大型项目如Chrome&#xff0c;往往需要处理大量的代码文件和依赖库&#xff0c;这个过程既复杂又耗时。因此&#xff0c;任何能够提升编译速度的技巧&#xff0c;都能显著提高开发效率&a…

Dubbo本地调试解决方案

有三种方式:原文链接 本文尝试使用了原作者推荐的第二种方式&#xff0c;在启动本地的服务时加入全局版本号的参数 -Ddubbo.service.versiontest同时需要修改消费者侧API的版本号。 DubboReference(version "test")private IContentPortraitService contentPortra…

Python-题库篇-基础

文章目录 Python-题库篇-基础题目001: 在Python中如何实现单例模式。题目002&#xff1a;不使用中间变量&#xff0c;交换两个变量a和b的值。题目003&#xff1a;写一个删除列表中重复元素的函数&#xff0c;要求去重后元素相对位置保持不变。题目004&#xff1a;假设你使用的是…

CentOS7.6安装RabbitMQ

前言&#xff1a;因为RabbitMQ是ERlang语言编写所以要先安装ERlang再安装RabbitMQ 安装ERlang 借鉴前辈原文地址&#xff1a;https://www.cnblogs.com/fengyumeng/p/11133924.html 第一步&#xff1a;安装依赖 yum -y install gcc glibc-devel make ncurses-devel open…

快速上手 Spring Boot:基础使用详解

快速上手 Spring Boot&#xff1a;基础使用详解 文章目录 快速上手 Spring Boot&#xff1a;基础使用详解1、什么是SpringBoot2、Springboot快速入门搭建3、SpringBoot起步依赖4、SpringBoot自动配置&#xff1a;以tomcat启动为例5、SpringBoot基础配置6、yaml7、多环境开发配置…

使用Ghostscript将PostScript(.ps)文件转换为PDF文件格式

如何使用Ghostscript将PostScript文件转换为PDF文件格式: /* Example of using GS DLL as a ps2pdf converter. */#if defined(_WIN32) && !defined(_Windows) # define _Windows #endif #ifdef _Windows /* add this source to a project with gsdll32.dll, or comp…

顶尖项目经理都在用的SOP

接受任务SOP 了解任务背景了解任务目标&#xff08;包含deadline&#xff09;拆解任务&#xff0c;确认负责人执行方案审批确认跟进执行并定期汇报验收结果&#xff0c;进行反馈相关文档存档&#xff0c;形成闭环 推进任务SOP - PDCA循环 制定计划 Plan。依据目标&#xff0c…

MacBook Pro 忘记root用户密码,重置密码步骤

一、以普通用户名登录系统&#xff0c;并打开terminal终端&#xff0c; 输入&#xff1a;sudo bash sudo bash Password:*****&#xff08;输入当前用户的密码&#xff09; 成功后进入bash-3.2#的命令模式 二、在bash-3.2#命令模式下 输入&#xff1a;sudo passwd root sud…

生信算法8 - HGVS转换与氨基酸字母表

HGVS 概念 HGVS 人类基因组变异协会(Human Genome Variation Society)提出的转录本编号&#xff0c;cDNA 参考序列(以前缀“c.”表示)、氨基酸参考序列(以前缀“p.”表示)。cDNA 中一种碱基被另一种碱基取代&#xff0c;以“>”进行表示&#xff0c;如&#xff1a;c.2186A&…

python数据分析——数据预处理

数据预处理 前言一、查看数据数据表的基本信息查看info&#xff08;&#xff09;示例 查看数据表的大小shape&#xff08;&#xff09;示例 数据格式的查看type()dtype&#xff08;&#xff09;dtypes&#xff08;&#xff09;示例一示例二 查看具体的数据分布describe()示例 二…

算法常见手写代码

1.NMS def py_cpu_nms(dets, thresh):"""Pure Python NMS baseline."""#x1、y1、x2、y2、以及score赋值x1 dets[:, 0]y1 dets[:, 1]x2 dets[:, 2]y2 dets[:, 3]scores dets[:, 4]#每一个检测框的面积areas (x2 - x1 1) * (y2 - y1 1)#按…

Windows环境如何ssh远程连接本地局域网内的Archcraft系统

文章目录 前言1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接小结 5. 固定SSH公网地址6. SSH固定地址连接 前言 本文主要介绍如何在Archcraft系统中安装Cpolar内网穿透工具,并以实现Windows环境ssh远程连接本地局域网Archcraft系统来说明使用…

相位和展开相位

相位 (Phase) 相位是一个周期信号在一个周期内的位置&#xff0c;通常以角度&#xff08;度或弧度&#xff09;表示。在许多应用中&#xff0c;相位被限制在一个周期内。例如&#xff0c;相位通常被限定在 −180∘到 180∘ 或 0∘ 到 360∘ 之间。 示例 −90∘ 表示信号在周…