当前位置:   article > 正文

编写独立应用程序实现求平均值问题_3、编写独立应用程序实现求平均值问题 每个输入文件表示班级学生某个学科的成绩,

3、编写独立应用程序实现求平均值问题 每个输入文件表示班级学生某个学科的成绩,

目录

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

条件 

Algorithm成绩的样例如下:

 Database成绩的样例如下:

 Python成绩的样例如下:

 平均成绩的样例如下:

准备工作 

题目

(1)假设当前目录为/usr/local/spark/mycode/AvgScore,在当前目录下新建一个目录src/main/scala,然后在目 录/usr/local/spark/mycode/AvgScore/src/main/scala 下新建一个AvgScore.scala。复制如下代码:

 (2)在/usr/local/spark/mycode/AvgScore目录下新建simple.sbt,复制如下代码:

 (3)在/usr/local/spark/mycode/AvgScore目录下执行如下命令打包程序:

(4)在/usr/local/spark/mycode/AvgScore 目录下执行如下命令提交程序:  

(5)在/usr/local/spark/mycode/AvgScore/result 目录下即可得到结果文件。

补充:


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

条件 

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

Algorithm成绩的样例如下:

小明92
小红87
小新82
小丽90

 Database成绩的样例如下:

小明95
小红81
小新89
小丽85

 Python成绩的样例如下:

小明83
小红82
小新94
小丽91

 平均成绩的样例如下:

小明89.67
小红83.67
小新88.33
小丽88.67

准备工作 

1.进入到mycode目录,新建RemDup目录(没有mycode目录可以新建一个) 

再进入到RemDup目录中去

2.新建datas目录,写入文件algorithm、database、python:

 写入文件:

文件内容为:

↑这个内容很好看,但是很愚蠢,不知道的话这里错误会浪费几个小时(肯定不是我)

注意这里 algorithm、database 和 python 文件内容不能有多余的换行符或者空格!

所以内容复制粘贴以下内容 :

Algorithm

  1. 小明 92
  2. 小红 87
  3. 小新 82
  4. 小丽 90

 Database

  1. 小明 95
  2. 小红 81
  3. 小新 89
  4. 小丽 85

 Python

  1. 小明 82
  2. 小红 83
  3. 小新 94
  4. 小丽 91

题目

书上是 avgscore ->AvgScore

(1)假设当前目录为/usr/local/spark/mycode/AvgScore,在当前目录下新建一个目录src/main/scala,然后在目 录/usr/local/spark/mycode/AvgScore/src/main/scala 下新建一个AvgScore.scala。复制如下代码:

//书上的源码

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:///home/hadoop/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("result")
    }
}

  1. //实际运行代码
  2. //导入必要的 Spark 库:
  3. import org.apache.spark.SparkContext
  4. import org.apache.spark.SparkContext._
  5. import org.apache.spark.SparkConf
  6. import org.apache.spark.HashPartitioner
  7. //定义应用程序对象和入口点:
  8. object AvgScore {
  9. def main(args: Array[String]) {
  10. //设置 Spark 应用程序的配置:
  11. val conf = new SparkConf().setAppName("AvgScore")
  12. val sc = new SparkContext(conf)
  13. //定义数据文件的路径并加载数据:
  14. val dataFile = "file:///usr/local/spark/mycode/AvgScore/datas"
  15. /*
  16. 这里使用 sc.textFile() 方法加载一个文本文件,
  17. 3 参数指定每个分区包含的行数。
  18. */
  19. val data = sc.textFile(dataFile,3)
  20. //定义一个计算平均分的函数,并应用到数据集上:
  21. val res = data
  22. //filter() 方法通过 trim() 函数过滤空行
  23. .filter(_.trim().length > 0)
  24. /*
  25. map() 方法转换数据集,每行数据被转换成一个元组,包含学生姓名和成绩。
  26. split() 方法用于将行拆分为数组
  27. trim() 方法用于去除多余的空格,并将成绩转换为整数。
  28. */
  29. .map(line => (line.split(" ")(0).trim(), line.split(" ")(1).trim().toInt))
  30. //partitionBy() 方法将结果分区。
  31. .partitionBy(new HashPartitioner(1))
  32. //groupByKey() 方法将数据集按键(学生姓名)分组。
  33. .groupByKey()
  34. /*map() 方法遍历分组,计算平均成绩,并格式化为两位小数。
  35. 函数返回一个新的元组,包含学生姓名和平均成绩。*/
  36. .map(x => {
  37. var n = 0
  38. var sum = 0.0
  39. for (i <- x._2) {
  40. sum = sum + i
  41. n = n + 1
  42. }
  43. val avg = sum / n
  44. val format = f"$avg%1.2f".toDouble
  45. (x._1, format)
  46. })
  47. /*
  48. 将结果保存到输出文件:
  49. 这里使用 saveAsTextFile() 方法将结果保存到一个文本文件。
  50. Spark 会自动将数据保存在多个分区中。
  51. */
  52. res.saveAsTextFile("file:///usr/local/spark/mycode/AvgScore/result")
  53. }
  54. }

 (2)在/usr/local/spark/mycode/AvgScore目录下新建simple.sbt,复制如下代码:

name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"

这里我先查看scala 和spark版本并修改

scala 2.11.12 => 2.11.6

spark 2.4.0 => 2.4.0

 修改好内容如下:

 (3)在/usr/local/spark/mycode/AvgScore目录下执行如下命令打包程序:

sudo /usr/local/sbt/sbt package

打包过程很长

结果如下:

(4)在/usr/local/spark/mycode/AvgScore 目录下执行如下命令提交程序:  

/usr/local/spark/bin/spark-submit --class "AvgScore"  /usr/local/spark/mycode/avgscore/target/scala-2.11/simple-project_2.11-1.0.jar

  (5)在/usr/local/spark/mycode/AvgScore/result 目录下即可得到结果文件。

补充:

scala运行版本和查看版本不一致,让人思考simple.sbt底下用哪个版本合适

实验结果过后表明,两个版本都可以

 scala2.11.12  底下的运行结果

 查看结果

 据此编写独立应用程序实现求平均值问题完成

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号