1 实验目的
1、熟悉 Spark 的 RDD 基本操作及键值对操作;
2、熟悉使用 RDD 编程解决实际具体问题的方法
2 实验平台
1、Spark3.4.0 (Scala 版本为 2.12.17)
2、操作系统:Ubuntu16.04
3、Jdk版本:1.8或以上版本。
3 实验要求
1.每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。下面是输入文件和输出文件的一个样例,供参考。
Algorithm成绩:
小明 92
小红 87
小新 82
小丽 90
Database成绩:
小明 95
小红 81
小新 89
小丽 85
Python成绩:
小明 82
小红 83
小新 94
小丽 91
平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
4 实验内容和步骤(操作结果要附图)
假设当前目录为/usr/local/spark/mycode/avgscore,在当前目录下新建一个目录mkdir -p src/main/scala,然后在目录/usr/local/spark/mycode/avgscore/src/main/scala下新建一个avgscore.scala
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
object AvgSore {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("AvgScore")
val sc = new SparkContext(conf)
val dataFile = "file:///home/hadoop/data/Algorithm.txt,file:///home/hadoop/data/Database.txt,file:///home/hadoop/data/Python.txt"
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 formattedAvg = f"$avg%1.2f".toDouble
(x._1, formattedAvg)
})
res.saveAsTextFile("file:///usr/local/spark/mycode/AvgScore/result")
}
}
}
在目录/usr/local/spark/mycode/avgscore目录下新建simple.sbt
name := "Simple Project"
version := "1.0"
scalaVersion := "2.12.17"
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.4.0"
进行打包
sudo /usr/local/sbt/sbt package
进行运行
/usr/local/spark/bin/spark-submit --class "AvgScore" /usr/local/spark/mycode/avgscore/target/scala-2.12/simple-project_2.12-1.0.jar
5 实验总结
- 总结所学的RDD编程基础知识和实践经验。
- 强调继续学习和探索更高级的Spark编程概念和技术。