头歌:RDD的创建 -Scala

embedded/2024/9/22 15:47:53/

第1关:集合并行化创建RDD


任务描述


本关任务:计算并输出各个学生的总成绩。

相关知识


为了完成本关任务,你需要掌握:1.集合并行化创建RDD,2.reduceByKey算子、foreach算子

集合创建RDD
Spark会将集合中的数据拷贝到集群上去,形成一个分布式的数据集合,也就是一个RDD。相当于是,集合中的部分数据会到一个节点上,而另一部分数据会到其他节点上。然后就可以用并行的方式来操作这个分布式数据集合,即RDD。

val list=List(1,2,3,4,5)
val stu=sc.parallelize(list,3)//参数1:Seq集合,必须。参数2:分区数,默认为该Application分配到的资源的CPU核数
//val stu=sc.makeRDD(list,3) //和parallelize用法一样。(该用法可以指定每一个分区的preferredLocations)。
val sum=stu.reduce(_+_)
println(sum)


输出:15

reduceByKey()
对元素为RDD[K,V]对的RDD中Key相同的元素的Value进行聚合

val list = List(("spark",2),("hive",1),("hive",2))
val stuRDD = sc.makeRDD(list)
stuRDD.reduceByKey(_+_)


输出:
(spark,2)
(hive,3)

foreach() :对数据集中每一个元素运行函数

val list = List(1,2,3,4)
val stuRDD = sc.makeRDD(list)
stuRDD.foreach(print)//对这个RDD进行遍历输出


输出:1234

编程要求
根据提示,在右侧编辑器begin-end处补充代码,计算并输出各个学生的总成绩。

("bj",88): bj指学生姓名,88指学生成绩。
测试说明
平台会对你编写的代码进行测试:

预期输出:

(bj,254)
(sh,221)
(gz,285)

import org.apache.spark.SparkContext
import org.apache.spark.SparkConfobject Student {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local")val sc = new SparkContext(conf)val arr1=Array(("bj",88),("sh",67),("gz",92))val arr2=Array(("bj",94),("sh",85),("gz",95))val arr3=Array(("bj",72),("sh",69),("gz",98))/********** begin **********/// 第一步:先将数组进行合并val combinedArr = arr1 ++ arr2 ++ arr3// 第二步:创建RDDval rdd = sc.parallelize(combinedArr)// 第三步:把相同key的进行聚合val totalScores = rdd.reduceByKey(_ + _)// 第四步:输出totalScores.collect().foreach(println)/********** end **********/sc.stop()}
}

这段代码首先创建了一个配置为本地模式的 SparkConf 和 SparkContext。然后,它定义了三个包含学生姓名和成绩的数组。在 begin 和 end 之间,代码执行了以下步骤:

使用 ++ 运算符将三个数组合并成一个数组。
使用 sc.parallelize(combinedArr) 将合并后的数组并行化,创建一个 RDD。
使用 reduceByKey(_ + _) 对 RDD 中的相同键(学生姓名)的值(成绩)进行聚合,得到每个学生的总成绩。
使用 collect().foreach(println) 方法将分布式数据集中的结果收集到驱动程序中,并遍历打印每个学生的总成绩。

第2关:读取外部数据集创建RDD


任务描述

本关任务:读取文本文件,按照文本中数据,输出老师及其出现次数。

相关知识

为了完成本关任务,你需要掌握:1.读取文件创建RDD,2.本关所需算子。

读取文件

textFile()

 
  1. val rdd = sc.textFile("/home/student.txt")//文件路径
算子

(1)map:对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD

 
  1. scala> val numbers=sc.makeRDD(List(1,2,3,4))
  2. scala> numbers.map((i: Int) => i * 2)
  3. res0: List[Int] = List(2, 4, 6, 8)

(2) reduceByKey() :对元素为RDD[K,V]对的RDDKey相同的元素的Value进行聚合。

 
  1. val list = List(("spark",2),("hive",1),("hive",2))
  2. val stuRDD = sc.makeRDD(list)
  3. stuRDD.reduceByKey(_+_).foreach(println)

输出: (spark,2) (hive,3)

(3)sortBy() :对RDD中的元素进行排序。

 
  1. val list = List(("spark",2),("hive",1),("hadoop",4))
  2. val stuRDD = sc.makeRDD(list)
  3. stuRDD.sortBy(_._2,false,3)//参数1:函数,排序规则有这个函数决定(必填) 参数2:升降序(true为升序,false为降序) 参数3:分区数量
编程要求

根据提示,在右侧编辑器begin-end处补充代码,按每位老师出现的次数降序,输出老师姓名和出现次数。

  • 输入文件样例:

bigdata,laozhang bigdata,laoduan javaee,xiaoxu

bigdata指科目,laozhang指老师名称。

测试说明

平台会对你编写的代码进行测试:

预期输出: (laozhao,15) (laoyang,9) (laoduan,5) (xiaoxu,4) (laoli,3) (laozhang,2) (laoliu,1)

import org.apache.spark.SparkContext
import org.apache.spark.SparkConfobject Teachers {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("Teachers").setMaster("local")val sc = new SparkContext(conf)val dataFile = "file:///root/step2_files"/********** begin **********/// 第一步:以外部文件方式创建RDDval rdd = sc.textFile(dataFile)// 第二步:将文件中每行的数据切分,得到自己想要的返回值val teacherRdd = rdd.map(line => (line.split(",")(1), 1))// 第三步:将相同的key进行聚合val aggregatedRdd = teacherRdd.reduceByKey(_ + _)// 第四步:按出现次数进行降序val sortedRdd = aggregatedRdd.sortBy(_._2, false)// 第五步:输出sortedRdd.collect().foreach(println)/********** end **********/sc.stop()}
}

这段代码首先创建了一个配置为本地模式的 SparkConf 和 SparkContext。然后,它定义了要读取的文本文件路径。在 begin 和 end 之间,代码执行了以下步骤:

使用 sc.textFile(dataFile) 从外部文件创建一个 RDD。
使用 map 函数将每行数据切分为老师名称和科目,并创建一个由老师名称和出现次数(初始为1)组成的元组 RDD。
使用 reduceByKey 函数对 RDD 中的相同老师名称的记录进行聚合,得到每位老师的总出现次数。
使用 sortBy 函数按照出现次数进行降序排序。
使用 collect().foreach(println) 方法将排序后的结果收集到驱动程序中,并遍历打印每位老师的姓名和出现次数。


http://www.ppmy.cn/embedded/30917.html

相关文章

Java中的Lambda表达式

Lambda表达式的标准格式 格式:(形式参数)->{代码块} 形式参数:如果有多个参数,参数之间用逗号隔开 如果没有参数,留空即可 ->:由英文中画线和大于符号组成,固定写法。代表着…

Mybatis之Sqlsession、Connection和Transaction三者间的关系

前言 最近在看Mybatis的源码,搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系,debug之后发现有不少疑惑,于是按照原文整理了一下,记录下debug中的一些困惑点。 对于我们开发来讲,不管跟任何关系…

低代码技术在构建质量管理系统中的应用与优势

引言 在当今快节奏的商业环境中,高效的质量管理系统对于组织的成功至关重要。质量管理系统帮助组织确保产品或服务符合客户的期望、符合法规标准,并持续改进以满足不断变化的需求。与此同时,随着技术的不断进步,低代码技术作为一…

分享从零开始学习网络设备配置--任务5.2 组建旁挂式三层无线局域网

任务描述 某公司需要在原有网络中部署WLAN,以满足员工的移动办公需求。由于原来的有线网络较为复杂,为满足WLAN组网的灵活性,管理员小赵准备采用AC瘦AP旁挂式三层组网方案,AP1部署在销售部办公室,AP2部署在财务部办公室…

MySQL-SQL执行流程及原理

1、SQL执行流程 2、查询流程 查询缓存: MySQL服务器如果在查询缓存中存在该SQL语句,就直接将结果返回给客户端,没有就进入解析器解析阶段。(MySQL 8.0 删除该功能)解析器:在解析器中对SQL语句进行语法及语…

谷粒商城实战(019 RabbitMQ-发送消息)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第248p-第p261的内容 介绍 MQ的三大特点:流量削峰、应用解耦、异步处理 redis是数据缓存,mq是任务缓存 AMQP的MODEL 第一…

使用STM32F103C8T6与蓝牙模块HC-05连接实现手机蓝牙控制LED灯

导言: 在现代智能家居系统中,远程控制设备变得越来越普遍和重要。本文将介绍如何利用STM32F103C8T6单片机和蓝牙模块HC-05实现远程控制LED灯的功能。通过这个简单的项目,可以学会如何将嵌入式系统与蓝牙通信技术相结合,实现远程控制的应用。 目录 导言: 准备工作: 硬…

人大金仓数据库的数据分析的方法和工具

人大金仓数据库作为中国社会科学院经济研究所主办的重要数据平台,不仅提供丰富的经济学研究成果,还支持用户进行数据分析和挖掘,以发现数据中的规律和趋势。在以下的论述中,我将深入探讨人大金仓数据库的数据分析方法和工具。 数…