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.example

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types._
import scala.collection.mutable.ListBuffer

object keywords {
  def main(args: Array[String]): Unit = {
    //构建SparkSession
    // 构建SparkSession
    val 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]转为DataFrame
    val 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不仅简化了代码编写,还提高了数据处理的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 中实现用户上传文件夹的功能

vue 中实现上传文件夹的功能 使用 input 元素的 webkitdirectory 属性使用 vue-simple-uploader 组件 vue 中文件上传一般都是用 element 中的 upload 组件&#xff0c;upload 组件可以实现单个文件或者多个文件的上传&#xff0c;但是无法通过选择文件夹上传其中文件。 要实现…

账号和权限的管理

文章目录 管理用户账号和组账号用户账号的分类超级用户普通用户程序用户 UID&#xff08;用户id)和(组账号)GIDUID用户识别号GID组标识号 用户账号文件添加用户账号设置/更改用户口令 管理用户账号和组账号 用户账号的分类 超级用户 root 用户是 Linux 操作系统中默认的超级…

计算机毕业设计hadoop+spark+hive游戏推荐系统 游戏数据分析可视化大屏 steam游戏爬虫 游戏大数据 大数据毕业设计 机器学习 知识图谱

游戏推荐系统开题报告 一、引言 随着信息技术和网络技术的飞速发展&#xff0c;电子游戏已成为人们日常生活中不可或缺的一部分。然而&#xff0c;面对海量的游戏资源&#xff0c;用户往往难以找到适合自己的游戏。因此&#xff0c;构建一个高效、准确的游戏推荐系统显得尤为…

Go-知识并发控制mutex

Go-知识并发控制mutex 1. 介绍2. 数据结构2.1 Mutex 结构体2.2 Mutex 方法 3. 加锁解锁过程3.1 简单加锁3.2 加锁被阻塞3.3 简单解锁3.4 解锁并唤醒协程 4. 自旋过程4.1 什么是自旋4.2 自旋条件4.3 自旋的优势4.4 自旋的问题 5. Mutex 模式5.1 Normal 模式5.2 Starving 模式(饥…

React实现H5手势密码

监测应用进入前后台 在JavaScript中&#xff0c;监听H5页面是否在前台或后台运行&#xff0c;主要依赖于Page Visibility API。这个API在大多数现代浏览器中都是支持的&#xff0c;包括苹果的Safari和谷歌的Chrome&#xff08;也就基本覆盖了Android和iOS平台&#xff09;。下…

RabbitMQ 学习笔记

RabbitMQ学习笔记 一些概念 Broker &#xff1a;RabbitMQ服务。 virtual host&#xff1a; 其实就是分组。 Connection&#xff1a;连接&#xff0c;生产者消费者与Broker之间的TCP连接。 Channel&#xff1a;网络信道&#xff0c;轻量级的Connection&#xff0c;使用Chann…

【C++】一个极简但完整的C++程序

一、一个极简但完整的C程序 我们编写程序是为了解决问题和任务的。 1、任务&#xff1a; 某个书店将每本售出的图书的书名和出版社&#xff0c;输入到一个文件中&#xff0c;这些信息以书售出的时间顺序输入&#xff0c;每两周店主会手工计算每本书的销售量、以及每个出版社的…

任务调度框架革新:TASKCTL在Docker环境中的高级应用

Docker&#xff1a;轻量级容器化技术的魅力 Docker 作为一款开源的轻量级容器化技术&#xff0c;近年来在 IT 界掀起了一股热潮。它通过封装应用及其运行环境&#xff0c;使得开发者可以快速构建、部署和运行应用。Docker 的优势在于其轻量级、可移植性和可扩展性&#xff0c;它…

http和https的区别在哪

HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;超文本传输安全协议&#xff09;之间存在几个关键区别主要涉及安全性、端口、成本、加密方式、搜索引擎优化&#xff08;SEO&#xff09;、身份验证等方面 1、安全性&#xff1a;HTTP&#xff08;超文本传输协议…

Python | Leetcode Python题解之第171题Excel列表序号

题目&#xff1a; 题解&#xff1a; class Solution:def titleToNumber(self, columnTitle: str) -> int:number, multiple 0, 1for i in range(len(columnTitle) - 1, -1, -1):k ord(columnTitle[i]) - ord("A") 1number k * multiplemultiple * 26return n…

CASS界址点顺序重排

1、绘制一个宗地&#xff0c;如下&#xff1a; 2、注记界址点号&#xff0c;如下 3、【地籍】--【调整宗地内界址点顺序】&#xff0c;如下&#xff1a; 重排完成后&#xff0c;点击工具栏的【重】按钮&#xff0c;即可刷新标注。

Docker 拉取镜像失败处理 配置使用代理拉取

解决方案 1、在 /etc/systemd/system/docker.service.d/http-proxy.conf 配置文件中添加代理信息 2、重启docker服务 具体操作如下&#xff1a; 创建 dockerd 相关的 systemd 目录&#xff0c;这个目录下的配置将覆盖 dockerd 的默认配置 代码语言&#xff1a;javascript 复…

Golang | Leetcode Golang题解之第171题Excel列表序号

题目&#xff1a; 题解&#xff1a; func titleToNumber(columnTitle string) (number int) {for i, multiple : len(columnTitle)-1, 1; i > 0; i-- {k : columnTitle[i] - A 1number int(k) * multiplemultiple * 26}return }

Linux——ansible关于“文件操作”的模块

修改文件并将其复制到主机 一、确保受管主机上存在文件 使用 file 模块处理受管主机上的文件。其工作方式与 touch 命令类似&#xff0c;如果不存在则创建一个空文件&#xff0c;如果存在&#xff0c;则更新其修改时间。在本例中&#xff0c;除了处理文件之外&#xff0c;Ansi…

2024广东省职业技能大赛云计算赛项实战——Redis主从架构

Redis主从架构 前言 Redis是一个开源的内存数据结构存储系统&#xff0c;一般用于作为数据库、缓存和消息代理使用&#xff0c;而主从架构是许多分布式系统中常见的设计模式&#xff0c;用来提高系统的性能、可靠性和扩展性。 虚拟机使用的是自行创建的CentOS7&#xff0c;如…

自定义平台后台登录地址前缀的教程

修改平台后台地址默认的 admin 前缀 修改后端 config/admin.php 配置文件,为自定义的后缀 修改 平台后台前端源码中 src/settings.js 文件,修改为和上面一样的配置 修改后重新打包前端代码,并且覆盖到后端的 public 目录下 重启 swoole 服务即可

关于如何得到Mindspore lite所需要的.ms模型

关于如何得到Mindspore lite所需要的.ms模型 一、.ckpt模型文件转.mindir模型二、.mindir模型转.ms模型三、其它3.1 代码3.2 数据 四、参考文档 一、.ckpt模型文件转.mindir模型 由于要得到ms模型&#xff0c;mindspore的所有模型里面&#xff0c;是必须要用mindir模型才可以进…

计算机毕业设计Python深度学习房价预测 房价可视化 链家爬虫 房源爬虫 房源可视化 卷积神经网络 大数据毕业设计 机器学习 人工智能 AI

基于python一/二手房数据爬虫分析预测系统可视化 商品房数据Flask框架&#xff08;附源码&#xff09; 项目介绍python语言、Flask框架、MySQL数据库、Echarts可视化 sklearn机器学习 多元线性回归预测模型、requests爬虫框架 链家一手房 一手房数据商品房数据、分析可视化预测…

Unexpected tokens (use ‘;‘ to separate expressions on the same line)

idear配置gradle时,出现这样的错误&#xff1a; 一、dependencies dependencies { testImplementation(platform("org.junit.jupiter:junit-jupiter-api:5.9.1")) testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.1") // https://mvnr…

苹果电脑如何清理磁盘空间 苹果电脑如何清理系统数据

你是否遇到过电脑磁盘空间不足的情况呢&#xff1f;Mac电脑有着流畅的操作系统&#xff0c;但是随着日常使用&#xff0c;可能电脑里的垃圾文件越来越多&#xff0c;导致磁盘空间不足&#xff0c;随之会出现电脑卡顿、软件闪退等情况。及时清理磁盘空间可以有效避免电脑这些问题…