一、实验目的
(1)熟悉 Spark 的 RDD 基本操作及键值对操作;

(2)熟悉使用 RDD 编程解决实际具体问题的方法。

二、实验平台
操作系统:centos6.4

Spark 版本:1.5.0

三、实验内容

实验一:

1.spark-shell 交互式编程

请到本教程官网的“下载专区”的“数据集”中下载 chapter5-data1.txt,该数据集包含 了某大学计算机系的成绩,数据格式如下所示:

首先开始我们的第一步,打开linux系统中的终端。

请根据给定的实验数据,在 spark-shell 中通过编程来计算以下内容:

将Data01.txt文件放置在usr/local/sparkdata/中

新建/usr/local/sparkdata文件夹

mkdir /usr/local/sparkdata

将Data01.txt文件放置在sparkdata中

发现权限不够,给/usr/local/sparkdata赋予操作权限

chmod 777 /usr/local/spakrdata

之后将Data01.txt文件移动到sparkdata中

(1)该系总共有多少学生;

val lines = sc.textFile("file:///usr/local/sparkdata/Data01.txt")
val par = lines.map(row=>row.split(",")(0))
val distinct_par = par.distinct()
distinct_par.count

(2)该系共开设来多少门课程;

val lines = sc.textFile("file:///usr/local/sparkdata/Data01.txt")
val par = lines.map(row=>row.split(",")(1))
val distinct_par = par.distinct()
distinct_par.count

(3)Tom 同学的总成绩平均分是多少;

val lines = sc.textFile("file:///usr/local/sparkdata/Data01.txt")
lines.filter(row=>row.split(",")(0)=="Tom")
.map(row=>(row.split(",")(0),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()

(4)求每名同学的选修的课程门数;

val line=sc.textFile("file:///usr/local/sparkdata/Data01.txt")

line.map(row=>(row.split(",")(0),row.split(",")(1))).

mapValues(x=>(1)).

reduceByKey((x,y)=>(x+y)).

collect()

(5)该系 DataBase 课程共有多少人选修;

val line=sc.textFile("file:///usr/local/sparkdata/Data01.txt")

line.filter(row=>row.split(",")(1)=="DataBase").

count()

(6)各门课程的平均分是多少;

val line=sc.textFile("file:///usr/local/sparkdata/Data01.txt")

line.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()

(7)使用累加器计算共有多少人选了 DataBase 这门课。

val lines = sc.textFile("file:///usr/local/sparkdata/Data01.txt")
val pare = lines.filter(row=>row.split(",")(1)=="DataBase").
map(row=>(row.split(",")(1),1))
val accum =sc.accumulator(0)
pare.values.foreach(x => accum.add(x))
accum.value

实验二

2.编写独立应用程序实现数据去重
对于两个输入文件 A 和 B,编写 Spark 独立应用程序,对两个文件进行合并,并剔除其 中重复的内容,得到一个新文件 C。下面是输入文件和输出文件的一个样例,供参考。 输入文件 A 的样例如下:

20170101 x

20170102 y

20170103 x

20170104 y

20170105 z

20170106 z

输入文件 B 的样例如下:

20170101 y

20170102 y

20170103 x

20170104 z

20170105 y

根据输入的文件 A 和 B 合并得到的输出文件 C 的样例如下:

20170101 x

20170101 y

20170102 y

20170103 x

20170104 y

20170104 z

20170105 y

20170105 z

20170106 z

package sn
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner object RemDup
{
def main(args:Array[String])
{
val conf = new SparkConf().setAppName("RemDup")
val sc = new SparkContext(conf)
val dataFile = "file:///usr/local/sparkdata/data42"
val data = sc.textFile(dataFile,)
val res = data.filter(_.trim().length>).map(line=>(line.trim,"")).partitionBy(new HashPartitioner()).groupByKey().sortByKey().keys
res.saveAsTextFile("result")
}
}

实验三

3.编写独立应用程序实现求平均值问题
每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生 名字,第二个是学生的成绩;编写 Spark 独立应用程序求出所有学生的平均成绩,并输出到 一个新文件中。下面是输入文件和输出文件的一个样例,供参考。

Algorithm 成绩:

小明 92

小红 87

小新 82

小丽 90

Database 成绩:

小明 95

小红 81

小新 89

小丽 85

Python 成绩:

小明 82

小红 83

小新 94

小丽 91

平均成绩如下:

(小红,83.67)

(小新,88.33)

(小明,89.67)

(小丽,88.67)

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner object AvgScore
{
def main(args:Array[String])
{
val conf = new SparkConf().setAppName("AvgScore")
val sc = new SparkContext(conf)
val dataFile = "file:///usr/local/spark/mycode/avgscore/data"
val data = sc.textFile(dataFile,3)
val res=data.filter(_.trim().length>0).map(line=>(line.split(" ")(0).trim(),line.split(" ")(1).trim().toInt)).partitionBy(new HashPartitioner(1)).groupByKey().map(x=>{
var n=0
var sum=0.0
for(i<-x._2){
sum=sum+i
n=n+1
}
val avg=sum/n
val format=f"$avg%1.2f".toDouble
(x._1,format)
})
res.saveAsTextFile("result2")
}
}

spark实验(四)--RDD编程(1)的更多相关文章

  1. 02、体验Spark shell下RDD编程

    02.体验Spark shell下RDD编程 1.Spark RDD介绍 RDD是Resilient Distributed Dataset,中文翻译是弹性分布式数据集.该类是Spark是核心类成员之 ...

  2. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  3. Spark学习之RDD编程总结

    Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...

  4. spark 中的RDD编程 -以下基于Java api

    1.RDD介绍:     RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...

  5. Spark学习笔记——RDD编程

    1.RDD——弹性分布式数据集(Resilient Distributed Dataset) RDD是一个分布式的元素集合,在Spark中,对数据的操作就是创建RDD.转换已有的RDD和调用RDD操作 ...

  6. 实验4 RDD编程初级实践

    1.spark-shell交互式编程 (1) 该系总共有多少学生 scala> val lines = sc.textFile("file:///usr/local/spark/spa ...

  7. Spark学习(2) RDD编程

    什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.弹性.里面的元素可并行计算的集合 RDD允 ...

  8. 假期学习【四】RDD编程实验一

    1.今天把Spark编程第三个实验的Scala独立程序编程写完了.使用 sbt 打包 Scala 程序,然后提交到Spark运行. 2.完成了实验四的第一项 (1)该系总共有多少学生:   map(t ...

  9. 假期学习【五】RDD编程实验四

    今天完成了实验四的第二问和第三问 第二题 对于两个输入文件 A 和 B,编写 Spark 独立应用程序,对两个文件进行合并,并剔除其 中重复的内容,得到一个新文件 C.下面是输入文件和输出文件的一个样 ...

随机推荐

  1. DVWA全级别之File Upload(文件上传)

    File Upload File Upload,即文件上传漏洞,通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带 ...

  2. mac VirtualBox虚拟机装CentOS,并配置网络,使其发布的静态网站能访问

    1.下载VirtualBox(macOS版本) 下载地址:https://download.virtualbox.org/virtualbox/6.0.8/VirtualBox-6.0.8-13052 ...

  3. Equalize

    You are given two binary strings aa and bb of the same length. You can perform the following two ope ...

  4. think PHP5中,模板、控制器、JavaScript的url跳转重定向方法

    php控制器中的跳转: 1, header()函数是PHP中进行页面跳转的一种十分简单的方法.主要功能是将HTTP协议标头(header)输出到浏览器. header("Location: ...

  5. IntelliJ IDEA 2017.3尚硅谷-----卸载

    直接在用户目录下搜索,卸载的干净就要删除 删除这两个目录,重启idea可以还原配置. editplus删除后重启也是这个效果

  6. DataGridView编辑后立即更新到数据库的两种方法

    DataGridView控件是微软预先写好的一个显示数据的控件,功能非常强大,可以显示来自数据库表的数据和XML等其他来源的数据. 方法一:基于DataAdapter对象创建一个CommandBuli ...

  7. c语言用raw socket进行抓包

    https://www.cnblogs.com/MrYuan/p/5215923.html https://blog.csdn.net/qq_41787205/article/details/8669 ...

  8. 旋转坐标+前缀和(zqu 25001)

    本题题意:在一个矩阵中,去随机一点,设定一个步数K,求出从这个点可以走到的范围的和,求最大值 思路:这个范围的和是一个菱形,我们把他旋转45°,然后成为一个正放的矩阵,求出二维前缀和 然后用前缀和的性 ...

  9. [爬坑记录] Qt 代码卡住 不发信号 不触发槽

    先让我激动一会儿 [捂脸] 最近在用Qt做个程序 用来参加比赛 期间总共遇到两次如标题的问题 也即是 莫名其妙的不触发槽函数了 而且原因也不一样 {先说明 我学习Qt依旧只是入门级 也许入不了大佬法眼 ...

  10. 设备驱动基础学习--/proc下增加节点

    在需要创建一个由一系列数据顺序组合而成的/proc虚拟文件或一个较大的/proc虚拟文件时,推荐使用seq_file接口. 数据结构struct seq_fille定义在include/linux/s ...