Spark大数据处理学习笔记(3.8.3) Spark RDD典型案例-利用RDD实现分组排行榜

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/Twpwe】

文章目录

  • 一、任务目标
  • 二、准备工作
    • 2.1 在本地创建成绩文件
    • 2.2 将成绩文件上传到HDFS上指定目录
  • 三、完成任务
    • 3.1 在Spark Shell里完成任务
      • 3.1.1 读取成绩文件得到RDD
      • 3.1.2 利用映射算子生成二元组构成的RDD
      • 3.1.3 按键分组得到新的二元组构成的RDD
      • 3.1.4 按值排序,取前三
      • 3.1.5 按指定格式输出结果
    • 3.2 在IntelliJ IDEA里完成任务
      • 3.2.1 打开RDD项目
      • 3.2.2 创建分组排行榜单例对象


一、任务目标

  • 分组求TopN是大数据领域常见的需求,主要是根据数据的某一列进行分组,然后将分组后的每一组数据按照指定的列进行排序,最后取每一组的前N行数据。
  • 有一组学生成绩数据
张三丰 90
李孟达 85
张三丰 87
王晓云 93
李孟达 65
张三丰 76
王晓云 78
李孟达 60
张三丰 94
王晓云 97
李孟达 88
张三丰 80
王晓云 88
李孟达 82
王晓云 98

  • 同一个学生有多门成绩,现需要计算每个学生分数最高的前3个成绩,期望输出结果如下所示
张三丰:94 90 87
李孟达:88 85 82
王晓云:98 97 93

二、准备工作

2.1 在本地创建成绩文件

  • /home目录里创建grades.txt文件
    在这里插入图片描述

2.2 将成绩文件上传到HDFS上指定目录

  • grades.txt上传到HDFS的/topn/input目录
    在这里插入图片描述

三、完成任务

3.1 在Spark Shell里完成任务

3.1.1 读取成绩文件得到RDD

  • 执行命令:val lines = sc.textFile("hdfs://master:9000/topn/input/grades.txt")
    在这里插入图片描述

3.1.2 利用映射算子生成二元组构成的RDD

val grades = lines.map(line => {
       val fields = line.split(" ")
       (fields(0), fields(1))
   }
)
grades.collect.foreach(println)


在这里插入图片描述

3.1.3 按键分组得到新的二元组构成的RDD

  • 执行命令:val groupGrades = grades.groupByKey()
    在这里插入图片描述

3.1.4 按值排序,取前三

val top3 = groupGrades.map(item => {
       val name = item._1
       val top3 = item._2.toList.sortWith(_ > _).take(3)
       (name, top3)
    }
)
top3.collect.foreach(println)


在这里插入图片描述

3.1.5 按指定格式输出结果

top3.collect.foreach(item => {
       val name = item._1
       var scores = ""
       item._2.foreach(score => scores = scores + " " + score)
       println(name + ":" + scores)
   }
)

在这里插入图片描述

  • 简化版
top3.collect.foreach(item => {
       val name = item._1
       val scores = item._2.mkString(" ")
       println(name + ": " + scores)
   }
)

3.2 在IntelliJ IDEA里完成任务

3.2.1 打开RDD项目

在这里插入图片描述

3.2.2 创建分组排行榜单例对象

  • 在cn.kox.rdd.day07包里创建GradeTopN单例对象
package cn.kox.rdd.day07

import org.apache.spark.{SparkConf, SparkContext}
/**
 * @ClassName: GradeTopN
 * @Author: Kox
 * @Data: 2023/6/15
 * @Sketch:
 */
object GradeTopN {
  def main(args: Array[String]): Unit = {
    // 创建Spark配置对象
    val conf = new SparkConf()
      .setAppName("GradeTopN") // 设置应用名称
      .setMaster("local[*]") // 设置主节点位置(本地调试)
    // 基于Spark配置对象创建Spark容器
    val sc = new SparkContext(conf)
    // 实现分组排行榜
    val top3 = sc.textFile("hdfs://master:9000/topn/input/grades.txt")
      .map(line => {
        val fields = line.split(" ")
        (fields(0), fields(1))
      }) // 将每行成绩映射成二元组(name, grade)
      .groupByKey() // 按键分组
      .map(item => {
        val name = item._1
        val top3 = item._2.toList.sortWith(_ > _).take(3)
        (name, top3)
      }) // 值排序,取前三
    // 输出分组排行榜结果
    top3.collect.foreach(item => {
      val name = item._1
      val scores = item._2.mkString(" ")
      println(name + ": " + scores)
    })
    // 停止Spark容器,结束任务
    sc.stop()
  }
}
  • 运行程序,查看结果
    在这里插入图片描述

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

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

相关文章

Spring Cloud Alibaba Seata(一)

目录 一、Seata 1、分布式事务简介 1.1、分布式事务理论 1.2、分布式事务解决方案 2、Seata简介 3、Seata安装 一、Seata 1、分布式事务简介 基础概念:事务ACID A(Atomic):原子性,构成事务的所有操作&#xf…

27-2BP_Adaboost强分类器公司财务预管建模——强分类器和弱分类器(附matlab程序)

1.简述 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数据,每组训练数据的权重都是1/m。然后用弱学习算法迭代运算T次&am…

爬虫小白应该如何学习爬虫

什么是Python3网络爬虫? 定义: 网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本。爬虫其实是通过编写程序,模拟浏览器上网&#x…

Flutter 库:强大的工具及扩展——nb_utils

Flutter 库:强大的工具及扩展——nb_utils 文章目录 Flutter 库:强大的工具及扩展——nb_utils一、概述1、简介2、功能3、官方资料 二、基本使用1、安装2、基本使用第一步:在 main.dart 中初始化第二步:在您的 MaterialApp 或 Cup…

SpringBoot中@ControllerAdvice的三种使用场景

一、全局异常处理 代码示例如下: /*** author qinxun* date 2023-06-14* Descripion: 业务层异常枚举*/ public enum ServiceExceptionEnum {SUCCESS(0, "成功"),ERROR(1, "失败"),SYS_ERROR(1000, "服务端发生异常"),MISSING_REQUEST_PARAM_E…

微信小程序自定义模块

自定义wxs并引入 新建一个tools.wxs 创建一些function,并使用moule.exports {}导出 使用 <wxs>标签 并填写正确src 书写module名称 之后在其他标签内&#xff0c;使用 {{自定的module名称.自定义的一个function并传入对应参数}}就可以实现参数在自定义function中的导入…

用docker搭建selenium grid分布式环境实践

目录 前言&#xff1a; selenium jar包直接启动节点 用docker命令直接启动 docker-compose 启动 Hub和node在一台机器上 Hub和node不在一台机器上 遗留问题 总结 前言&#xff1a; Selenium是一个流行的自动化测试工具&#xff0c;支持多种编程语言和多种浏览器。Sele…

SpringCloudAlibaba之Sentinel源码分析--protoc-3.17.3-win64

Sentinel源码分析 文章目录 Sentinel源码分析1.Sentinel的基本概念1.1.ProcessorSlotChain1.2.Node1.3.Entry1.3.1.自定义资源1.3.2.基于注解标记资源 1.4.Context1.4.1.什么是Context1.4.2.Context的初始化1.4.2.1.自动装配1.4.2.2.AbstractSentinelInterceptor1.4.2.3.Contex…

【linux kernel】linux media子系统分析之media控制器设备

文章目录 一、抽象媒体设备模型二、抽象媒体设备三、Entity四、Interfaces五、Pad六、Link七、Media图遍历八、使用计数和电源处理九、link设置十、Pipeline和Media流十一、链接验证十二、媒体控制器设备的分配器API 本文基于linux内核 4.19.4&#xff0c;抽象媒体设备模型框架…

chatgpt赋能python:Python如何查找特定名称文件

Python如何查找特定名称文件 在计算机文件管理和互联网网络应用程序中&#xff0c;查找特定文件往往是一项必要的任务。在使用Python编程时&#xff0c;我们可以使用Python内置的os模块来查找特定名称的文件。本文将介绍如何使用Python查找特定名称的文件&#xff0c;并提供实…

013:解决vue中不能加载.geojson的问题

第013个 查看专栏目录: VUE — element UI 本文章目录 问题状态造成这个结果的原因&#xff1a;解决办法Vue Loader 其他特性&#xff1a;专栏目标 问题状态 在做vue项目的时候&#xff0c;碰到这样一个问题&#xff0c;vue页面中引用一个.geojson文件&#xff0c;提示如下错误…

【C++篇】字符串:标准库string类

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

面试篇:Java基础

目录 一、HashMap 的底层结构和原理 1、JDK7 2、JDK8 3、扩容问题 二、讲一下你对动态代理的理解 1、JDK动态代理 2、CGLIB动态代理 三、Java 集合体系的划分、List、Set、Map 的区别 四、ArrayList 和 LinkedList 的区别 1、数据结构实现&#xff1a; 2、随机访问&a…

Python-Selenium-定位详解

目录 前言&#xff1a; 一、id定位 二、name定位 三、class_name定位 四、xpath定位 五、css_selector定位 六、tag_name定位 七、link_text 定位 八、Xpath&Css定位方法速查表 九、By定位 十、elements复数定位 十一、JS的定位 前言&#xff1a; Python是一种…

pikachu靶场-PHP反序列化

在理解这个漏洞前,你需要先搞清楚php中serialize()&#xff0c;unserialize()这两个函数。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{public $test"pikachu";}$snew S(); //创建一个对象serialize($s); //…

eclipse中创建一个maven父工程和几个模块(子工程)

示例&#xff1a;创建一个父工程和几个模块&#xff08;子工程&#xff09; 1&#xff09;、先创建一个父工程 注意&#xff1a;下面的Packaging选择pom&#xff1a; 点击Finish&#xff0c;父工程就创建好了&#xff1a; 2&#xff09;、再创建模块&#xff08;module&am…

RuntimeError: launcher ‘pdsh‘ not installed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

麒麟系统在线安装docker(x86/arm)

文章目录 一、查看系统版本&#xff0c;确认版本二、查看系统架构三、下载安装docker-ceX86架构安装aarch64架构 一、查看系统版本&#xff0c;确认版本 [rootlocalhost ~]# cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Sword)二、查看系统架构 [root…

基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

前言&#xff1a;本文为手把手教学飞控核心知识点之一的姿态解算——MPU6050 姿态解算&#xff08;飞控专栏第2篇&#xff09;。项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算&#xff08;四元数方法&#xff09;&#xff0c;搭配设计的卡尔曼滤波器与一阶低通滤波器…

软件设计模式之原型模式

一.定义 原型模式(Prototype Pattern)的简单程度仅次于单例模式和迭代器模式。正是由于简单&#xff0c;使用的场景才非常地多&#xff0c;其定义如下: Specify the kinds of objects to create using a prototypical instance, and create new objects by copyingthis protot…