Day15—热点搜索词统计

news2024/11/28 12:42:11

一、要求

根据用户上网的搜索记录对每天的热点搜索词进行统计,以了解用户所关心的热点话题。
要求完成:统计每天搜索数量前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不仅简化了代码编写,还提高了数据处理的性能。

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

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

相关文章

Linux:用户账号和权限管理的命令

目录 一、Linux用户的分类和组的分类 1.1、用户账号和组账号 1.2、用户的分类 1.3、组账号 1.4、用户账号文件/etc/passwd 二、用户管理相关命令 2.1、chage命令&#xff1a;用来修改帐号和密码的有效期限&#xff0c;针对目前系统已经存在的用户 2.2、useradd&#xf…

八大经典排序算法

前言 本片博客主要讲解一下八大排序算法的思想和排序的代码 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;排序_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 …

Java——web开发

两个月前大概学完了JavaSE&#xff0c;老师推荐说&#xff0c;直接做项目&#xff0c;跟着尚硅谷的视频去做。但对于我来说&#xff0c;难度还是太大了&#xff0c;可能一下午才搞懂几行代码&#xff0c;学习效率不高&#xff0c;&#xff0c;没有成就感和充实感。于是&#xf…

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结

当 QPS 超过某个阈值的时候&#xff0c;则采取措施进行流量控制。流量控制的效果包括以下几种&#xff1a;直接拒绝、Warm Up、匀速排队/排队等待。对应 FlowRule 中的 controlBehavior 字段。 注意&#xff1a;若使用除了直接拒绝之外的流量控制效果&#xff0c;则调用关系限流…

【Redis】哈希类型的常用命令以及使用场景

Redis 哈希是一种用于存储键值对的数据结构。在 Redis 哈希中&#xff0c;每个键&#xff08;key&#xff09;都关联着一个哈希表&#xff08;hash&#xff09;。这个哈希表包含了多个字段&#xff08;field&#xff09;和值&#xff08;value&#xff09;。哈希非常适合存储对…

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

题目&#xff1a; 题解&#xff1a; class Solution {public int titleToNumber(String columnTitle) {int number 0;int multiple 1;for (int i columnTitle.length() - 1; i > 0; i--) {int k columnTitle.charAt(i) - A 1;number k * multiple;multiple * 26;}ret…

44、基于深度学习的癌症检测(matlab)

1、基于深度学习的癌症检测原理及流程 基于深度学习的癌症检测是利用深度学习算法对医学影像数据进行分析和诊断&#xff0c;以帮助医生准确地检测癌症病变。其原理和流程主要包括以下几个步骤&#xff1a; 数据采集&#xff1a;首先需要收集包括X光片、CT扫描、MRI等医学影像…

【vite】define 全局常量定义

&#x1f9ed; define 说明 类型&#xff1a; Record<string, any> 定义全局常量替换方式。其中每项在开发环境下会被定义在全局&#xff0c;而在构建时被静态替换。 Vite 使用 esbuild define 来进行替换&#xff0c;因此值的表达式必须是一个包含 JSON 可序列化值&a…

xshell传输文件速率为0

你们好&#xff0c;我是金金金。 场景 此时我通过xshell客户端上传文件&#xff0c;速率一直为0 解决 安装 yum -y install lrzsz 即可 这个工具主要提供 rz 和 sz 命令&#xff0c;用于通过 Zmodem 协议在本地计算机和远程服务器之间传输文件 编写有误还请大佬指正&#xff0…

C++的智能指针 RAII

目录 产生原因 RAII思想 C11的智能指针 智能指针的拷贝与赋值 shared_ptr的拷贝构造 shared_ptr的赋值重置 shared_ptr的其它成员函数 weak_ptr 定制删除器 简单实现 产生原因 产生原因&#xff1a;抛异常等原因导致的内存泄漏 int div() {int a, b;cin >> a…

在Ubuntu系统中部署Java及Spring Boot开发环境

选择Java及Spring Boot构建Web服务具有显著优势&#xff0c;Java的跨平台兼容性保证了服务可在不同操作系统上顺畅运行&#xff0c;而Spring Boot的成熟框架则大大简化了开发流程&#xff0c;减少了繁琐配置。此外&#xff0c;强大的社区支持、易于维护与扩展的特性、优异的性能…

a-table 根据数据自动进行 行合并

<template><div class"chat_query_result"><button click"temp">点击</button><a-table :columns"columns" :data-source"data" bordered></a-table></div> </template><script&g…

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

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

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

题目&#xff1a; 题解&#xff1a; class Solution { public:int titleToNumber(string columnTitle) {int number 0;long multiple 1;for (int i columnTitle.size() - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return num…

万界星空科技MES系统中的仓库管理功能

制造执行系统&#xff08;Manufacturing Execution System&#xff0c;简称MES&#xff09;作为一种面向车间生产调度的管理信息系统&#xff0c;被广泛应用在车间作业调度和控制管理系统中&#xff0c;它以实现车间生产调度最优化为目标。同时&#xff0c;MES作为衔接ERP&…

Scikit-Learn梯度提升决策树(GBDT)

Scikit-Learn梯度提升决策树 1、梯度提升决策树(GBDT)1.1、Boosting方法1.2、GBDT的原理1.3、GBDT回归的损失函数1.4、梯度下降与梯度提升1.5、随机森林与GBDT1.6、GBDT的优缺点2、Scikit-Learn梯度提升决策树(GBDT)2.1、Scikit-Learn GBDT回归2.1.1、Scikit-Learn GBDT回归…

阿里云上构建_VPC专有网络_子网划分_原理说明_创建_释放---分布式云原生部署架构搭建006

可以看到有这种子网掩码计算工具可以使用 可以看到这个是,我们设计的一个子网 192.168.0.0/16 可以看到地址是 从192.168.0.1 到 192.168.255.254 有了子网,我们去看,可以看到在阿里云的管理后台,就有个 创建交换机.可以看到 然后指定这个交换机的网段 这里我们指定了192…

编写水文专业串口通讯软件的开发经历

编写水文专业串口通讯软件的开发经历 一、关于开发 YAC9900 水位雨量 RTU 通讯软件二、软件开发遇到的问题和困难1、开发架构的适应2、开发语言的学习3、.net core 8 架构中串口构建的难点4、YAC9900 水位雨量 RTU 通讯软件开发中的 UI 冻结 三、发现问题解决问题的具体办法1、…

会声会影2024专业免费版下载附带激活码序列号

&#x1f31f; 会声会影2024&#xff1a;你的视频编辑新伙伴&#xff01;大家好&#xff0c;今天来给你们安利一个超级棒的视频编辑软件——会声会影2024最新版本&#xff01;作为一位热爱创作的小伙伴&#xff0c;找到一款既强大又易用的视频编辑工具真的太重要了。而会声会影…

什么是嵌入式,单片机又是什么,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;从科普的角度&#xff0c;…