RDD编程初级实践

参考链接

spark入门实战系列--8MLlib spark 实战_mob6454cc68310b的技术博客_51CTO博客icon-default.png?t=N7T8https://blog.51cto.com/u_16099212/7454034

Spark和Hadoop的安装-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/138021948?spm=1001.2014.3001.5501

1. spark-shell交互式编程

启动spark-shell

cd /usr/local/spark/
./bin/spark-shell

1.1 该系总共有多少学生

注:我将下载的chapter5-data1.txt文件放在“/home/hadoop/下载”目录下。

val lines = sc.textFile("file:///home/hadoop/下载/chapter5-data1.txt")  #读取文件
lines.map(row=>row.split(",")(0)).distinct().count  #每一行作为一个字符串,用’,’分割,取第一个元素,distinct去重,count统计有多少数据项

1.2 该系共开设来多少门课程

lines.map(row=>row.split(",")(1)).distinct().count   #去第二个元素,去重,统计元素数量

1.3 Tom同学的总成绩平均分是多少

lines.filter(row=>row.split(",")(0)=="Tom")    #以','作为分隔符,用filter进行过滤,筛选出第一项是“Tom”的数据项.map(row=>(row.split(",")(0),row.split(",")(2).toInt))    #把第一项和第三项(姓名+成绩)合在一起构成一个数据项.mapValues(x=>(x,1))    #去除value,把x变成(x,1),第一项是原始数据,第二项是数字1.reduceByKey((x,y)=>(x._1+y._1,x._2+y._2))    #针对想对的Key(也就是姓名),来进行运行,运算规则是(x.1+y._1),表示求和,也就是对(x,1)分别进行求和.mapValues(x=>(x._1/x._2)).collect()  #求平均值运算,x._1是原始数据的求和,x._2是1的求和,表示数据项的个数

读取的是字符串,所以需要转Int .

1.4 求每名同学的选修的课程门数

lines.map(row=>(row.split(",")(0),1)).reduceByKey((x,y)=>x+y).collect 

首先是将数据变成(姓名,1)的map,然后针对相同key(姓名)的数据进行求和,也就是统计数据项的个数。 

1.5 该系DataBase课程共有多少人选修

lines.filter(row=>row.split(",")(1)=="DataBase").count #直接是筛选第二项(课程)是DataBase的数据,然后进行统计个数

1.6 各门课程的平均分是多少

lines.map(row=>(row.split(",")(1),row.split(",")(2).toInt)).mapValues(x=>(x,1)).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).mapValues(x=>(x._1/x._2)).collect()

 求平均分的部分和前面是保持一致的,区别就是筛选构成map的时候前面是根据“Tom”来划分,现在是根据第二项的课程来进行划分。

1.7 使用累加器计算共有多少人选了DataBase这门课

val acc=sc.longAccumulator("My Accumulator")    #定义一个累加器
# #筛选第二项是DataBase的数据项,构成一个(DataBase,1)的map,用foreach,对values值来进行累加
lines.filter(row=>row.split(",")(1)=="DataBase").map(row=>(row.split(",")(1),1)).values.foreach(x=>acc.add(x))
#输出累加值
acc.value

2. 编写独立应用程序实现数据去重

2.1创建相关项目

sudo mkdir -p /example/sparkapp4/src/main/scala
cd /example/sparkapp4/src/main/scala
sudo touch A.txt
sudo vim A.txt
sudo touch B.txt
sudo vim B.txt

sudo vim SimpleApp.scala
import java.io.FileWriter
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConfobject SimpleApp {def main(args: Array[String]): Unit = {//配置val conf = new SparkConf().setAppName("Simple Application")val sc = new SparkContext(conf)//读取文件A.txtval A = sc.textFile("file:///example/sparkapp4/src/main/scala/A.txt")//读取文件B.txtval B = sc.textFile("file:///example/sparkapp4/src//main/scala/B.txt")//对两个文件进行合并val C = A ++ B//1.用distinct进行去重//2.以空格来进行分割//3.根据key排序val distinct_lines = C.distinct().map(row => (row.split("    ")(0), row.split("    ")(1))).sortByKey()//将RDD类型的数据转换为数组val result = distinct_lines.collect()//将结果输出到C.txt中val out = new FileWriter("/example/sparkapp4/src/main/scala/C.txt", true)for (item <- result) {out.write(item + "\n")println(item)}out.close()}
}

 2.2创建.sbt文件

cd /example/sparkapp4
sudo touch build.sbt
sudo vim build.sbt
name := "Simple Project"
version := "1.0"
scalaVersion := "2.13.13"
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.5.1"

 2.3打包执行

 出现Exception in thread "main" java.io.FileNotFoundException:/example/sparkapp4/src/main/scala/C.txt (权限不够)

切换到root用户:su root

他这个空格我还是粘贴的,如果代码只有一个空格分割他的结果第二个数据是空的。

sudo /usr/local/sbt/sbt package
su root
spark-submit --class "SimpleApp" ./target/scala-2.13/simple-project_2.13-1.0.jar

3. 编写独立应用程序实现求平均值问题

3.1创建相关文件

sudo mkdir -p /example/sparkapp5/src/main/scala
cd /example/sparkapp5/src/main/scala
sudo vim Algorithm.txt
sudo vim Database.txt
sudo vim Python.txt

vim ./src/main/scala/SimpleApp.scala
import java.io.FileWriter
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConfobject SimpleApp {def main(args: Array[String]): Unit = {//配置val conf = new SparkConf().setAppName("Simple Application")val sc = new SparkContext(conf)//读取文件Algorithm.txtval Algorithm = sc.textFile("file:///example/sparkapp5/src//main/scala/Algorithm.txt")//读取文件Database.txtval Database = sc.textFile("file:///example/sparkapp5/src//main/scala/Database.txt")//读取文件Python.txtval Python = sc.textFile("file:///example/sparkapp5/src//main/scala/Python.txt")//对三个文件进行整合val scoreSum = Algorithm ++ Database ++ Python//以空格切割将名字作为key,(成绩,1)作为valueval student_grade = scoreSum.map(row => (row.split(" ")(0), (row.split(" ")(1).toInt, 1)))//求平均分数val student_ave = student_grade.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2)).map(x => (x._1, 1.0 * x._2._1 / x._2._2))//将RDD类型的数据转化为数组val result = student_ave.collect()val out = new FileWriter("/example/sparkapp5/src/main/scala/average.txt", true)for (item <- result) {out.write(item + "\n")println(item)}out.close()}
}

2.2创建.sbt文件

如上同

2.3打包执行

如上同

题目要求要保留两位小数,我找的那个没有保留小数,我目前写的这个小数后面不止两位。

写入文件采用的是追加的方式。

 补:

还是解决了,先写简单的程序调试,然后直接替换。

 刚开始想的不对,直接用的是Array,结果不出意外报错了。

object Test {def main(args: Array[String]): Unit = {var a = Array("feng", 12.355353)println(a)println(a(0))println(a(1))println(a(1).formatted("%.2f"))printf("%s %.2f\n", a(0), a(1))}
}

 因为需要格式化输出的是一个Map,不是Array,所以需要修改代码。

[Ljava.lang.Object;@43a25848
feng
12.355353
12.36
feng 12.36
object Test {def main(args: Array[String]): Unit = {var map = Map[String, Double]("feng" -> 12.442424, "xi" -> 13.35262, "ze" -> 23.151425)for (elem <- map) {println(elem)}for ((key, value) <- map) {val roundedValue = BigDecimal(value).setScale(2, BigDecimal.RoundingMode.HALF_UP).toDoubleprintln(s"($key,$roundedValue)")}}
}
(feng,12.442424)
(xi,13.35262)
(ze,23.151425)
(feng,12.44)
(xi,13.35)
(ze,23.15)

 之后就是直接替换原始的代码就行了。

import java.io.FileWriter
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConfobject SimpleApp {def main(args: Array[String]): Unit = {//配置val conf = new SparkConf().setAppName("Simple Application")val sc = new SparkContext(conf)//读取文件Algorithm.txtval Algorithm = sc.textFile("file:///example/sparkapp5/src//main/scala/Algorithm.txt")//读取文件Database.txtval Database = sc.textFile("file:///example/sparkapp5/src//main/scala/Database.txt")//读取文件Python.txtval Python = sc.textFile("file:///example/sparkapp5/src//main/scala/Python.txt")//对三个文件进行整合val scoreSum = Algorithm ++ Database ++ Python//以空格切割将名字作为key,(成绩,1)作为valueval student_grade = scoreSum.map(row => (row.split(" ")(0), (row.split(" ")(1).toInt, 1)))//求平均分数val student_ave = student_grade.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2)).map(x => (x._1, 1.0 * x._2._1 / x._2._2))//将RDD类型的数据转化为数组val result = student_ave.collect()val out = new FileWriter("/example/sparkapp5/src/main/scala/average.txt", true)/* for (item <- result) {out.write(item + "\n")println(item)}*/for ((key, value) <- result) {val roundedValue = BigDecimal(value).setScale(2, BigDecimal.RoundingMode.HALF_UP).toDoubleout.write(s"($key,$roundedValue)\n")println(s"($key,$roundedValue)")}out.close()}
}

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

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

相关文章

【介绍下如何使用CocoaPods】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Linux:服务器间同步文件的脚本(实用)

一、功能描述 比如有三台服务器&#xff0c;hadoop102、hadoop103、hadoop104&#xff0c;且都有atguigu账号 循环复制文件到所有节点的相同目录下&#xff0c;且脚本可以在任何路径下使用 二、脚本实现 1、查看环境变量 echo $PATH2、进入/home/atguigu/bin目录 在该目录下…

Redis 源码学习记录:字符串

redisObject Redis 中的数据对象 server/redisObject.h 是 Redis 对内部存储的数据定义的抽象类型其定义如下&#xff1a; typedef struct redisObject {unsigned type:4; // 数据类型&#xff0c;字符串&#xff0c;哈希表&#xff0c;列表等等unsigned encoding:4; …

文字PDF转图片PDF,适合pdf防复制

完整代码已传至github平台&#xff1a; https://github.com/yaunsine/text_pdf_to_image_pdf 分成两步操作&#xff1a; 1、将文字pdf输出成图片 2、将所有图片合成为pdf 将PDF文件输出为图片的形式 """pdf转图片 """ def pyMuPDF_fitz(pdfPa…

网页提示语闪太快的定位问题(selenium)

selenium UI自动化时&#xff0c;提示语闪太快&#xff0c;导致无法获取元素的问题 解决办法 步骤一&#xff1a; F12---》控制台输入debugger 步骤二&#xff1a;对于需要定位的部分&#xff0c;在控制台的debugger处回车&#xff0c;可以定住页面 步骤三&#xff1a;正常定…

Impala系统架构理解

1 impalad&#xff08;含3个模块&#xff0c;执行hbase或hdfs中的数据&#xff0c;数据的底层存储为hdfs&#xff09; 当用户通过用户接口提出查询或分析请求时&#xff0c;Impala会选择一个Impalad实例作为协调者&#xff08;Coordinator&#xff09;来负责整个查询过程的协调…

Android NDK开发 CMAKE 相关总结

预设变量含义介绍 工程结构组织&#xff1a; 代码目录 ├── CMakeLists.txt ├── a │ ├── CMakeLists.txt │ └── a.cpp └── b├── CMakeLists.txt├── b.cpp└── b.h路径相关&#xff1a; CMAKE_SOURCE_DIR&#xff1a;最顶层 CMakceLists.txt 所在…

【Python快速上手(六)】

目录 Python快速上手&#xff08;六&#xff09;Python3 列表和元组Python3 列表1.创建列表2.访问列表元素3.列表切片4.修改列表元素5.列表方法6.列表操作符注意事项 Python3 元组1.创建元组2.访问元组元素3.元组切片4.元组内置函数5.元组运算符注意事项 Python快速上手&#x…

【CTF Web】CTFShow web14 Writeup(PHP+switch case 穿透+SQL注入+文件读取)

web14 5 解法 <?php include("secret.php");if(isset($_GET[c])){$c intval($_GET[c]);sleep($c);switch ($c) {case 1:echo $url;break;case 2:echo A;break;case 555555:echo $url;case 44444:echo "A";break;case 3333:echo $url;break;case 222…

python网络爬虫爬取需要的数据

要爬取网站的数据&#xff0c;你可以使用 Python 的 requests 库来发送 HTTP 请求&#xff0c;并使用 BeautifulSoup 库来解析返回的 HTML 内容。但是&#xff0c;在此之前&#xff0c;你需要检查该网站的 robots.txt 文件&#xff0c;以确认是否允许爬虫抓取特定页面的数据。 …

win11 安装qt5.14.2 、qtcreator、vs编译器 。用最小安装进行 c++开发qt界面

系统 &#xff1a;win11 一、安装vs生成工具 &#xff0c;安装编译器 下载visualstudio tools 生成工具&#xff1a; 安装编译器 和 windows sdk&#xff1a; 安装debug 调试器&#xff1a; 二、Qt5.14.2下载 下载链接: Index of /archive/qt/5.14/5.14.2 安装qt 三、配置QT/…

ChuanhuChatGPT集成百川大模型

搭建步骤&#xff1a; 拷贝本地模型&#xff0c;把下载好的Baichuan2-7B-Chat拷贝到models目录下 修改modules\models\base_model.py文件&#xff0c;class ModelType增加Baichuan Baichuan 16 elif "baichuan" in model_name_lower: model_type ModelType.Ba…

短视频矩阵营销系统 poihuoqu 任意文件读取漏洞复现

0x01 产品简介 短视频矩阵营销系统是由北京华益云数据科技有限公司开发的一款产品,这家公司专注于抖音短视频矩阵营销系统的研发,致力于为企业提供全方位的短视频营销解决方案。华益云抖销短视频矩阵系统可以帮助企业快速搭建多个短视频账号,实现内容的批量制作和发布,提高…

PostgreSQL的扩展(extensions)-常用的扩展之pg_stat_kcache

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展之pg_stat_kcache pg_stat_kcache 是一个第三方的 PostgreSQL 扩展&#xff0c;它用于收集来自操作系统内核的查询级别的缓存使用和 I/O 统计信息。这个扩展提供了一个机制来补充 PostgreSQL 自带的统计信息&am…

Vue从0-1学会如何自定义封装v-指令

文章目录 介绍使用1. 理解指令2. 创建自定义指令3. 注册指令4. 使用自定义指令5. 自定义指令的钩子函数6. 传递参数和修饰符7. 总结 介绍 自定义封装 v-指令是 Vue.js 中非常强大的功能之一&#xff0c;它可以让我们扩展 Vue.js 的模板语法&#xff0c;为 HTML 元素添加自定义行…

【Go】匿名函数与闭包

目录 一、匿名函数 基础介绍 形式 示例程序 1: 直接调用 示例程序 2: 作为变量赋值 示例程序 3: 作为函数参数 示例程序 4: 使用匿名函数进行排序 示例程序 5: 匿名函数用于延迟执行 示例程序 6: 通过匿名函数实现迭代器 二、闭包用法 基础知识 示例程序 1: 状态保持…

Java毕业设计 基于SpringBoot vue城镇保障性住房管理系统

Java毕业设计 基于SpringBoot vue城镇保障性住房管理系统 SpringBoot 城镇保障性住房管理系统 功能介绍 首页 图片轮播 房源信息 房源详情 申请房源 公示信息 公示详情 登录注册 个人中心 留言反馈 后台管理 登录 个人中心 修改密码 个人信息 用户管理 房屋类型 房源信息管理…

flutter利用get中的GetConnect实现拦截请求

1、baseProvider.dart 文件&#xff0c;里面实现请求的拦截和响应的处理 import dart:convert;import package:company_manage_flutter/config/setting.dart; import package:flutter_easyloading/flutter_easyloading.dart; import package:get/get_connect/connect.dart;cla…

Servlet和Tomcat运作过程

记录一下前后端请求交互过程&#xff08;不涉及Spring框架&#xff09;&#xff1a; 编写一个UserServlet 在web.xml文件中编写映射路径 编写前端

HTTP基础知识

1. HTTP常见的状态码有哪些&#xff1f; 常见状态码&#xff1a; 200&#xff1a;服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。 301 &#xff1a; (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时&a…