实验三 RDD编程初级实践

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编程概念和技术。
在Apache Spark环境中,你可以通过创建一个Spark DataFrame来处理这种类型的数据。首先,需要读取输入文件,然后对每个学生的所有学科成绩进行分组计算平均值,并将结果保存到新的输出文件中。以下是一个简单的步骤概述: 1. **导入库**: 使用PySpark库,因为它是Spark Python API的官方库。 ```python from pyspark.sql import SparkSession ``` 2. **创建SparkSession**: 这是在Spark环境中启动一个会话。 ```python spark = SparkSession.builder.appName("StudentAverageScore").getOrCreate() ``` 3. **读取输入文件**: `spark.read.textFile`函数用于读取文本文件,然后转换为DataFrame。这里假设输入文件格式是逗号分隔的。 ```python input_data = spark.read.text("path_to_input_file") lines = input_data.selectExpr("split(value, &#39;,&#39;) as scores") # Split each line by comma score_df = lines.withColumnRenamed(&#39;scores&#39;, &#39;scores_array&#39;) \ .explode(&#39;scores_array&#39;) # Convert array of pairs to separate rows ``` 4. **解析数据**: 将每行的学生姓名和成绩提取出来。 ```python student_scores = score_df.select([&#39;col(0) as student_name&#39;, &#39;col(1).cast(&#39;float&#39;) as score&#39;]) ``` 5. **按学生分组计算平均分数**: 使用`groupBy`和`avg`操作。 ```python result = student_scores.groupBy(&#39;student_name&#39;).agg({&#39;score&#39;: &#39;avg&#39;}) ``` 6. **写入输出文件**: 使用`write.csv`函数将结果写入CSV文件。 ```python output_path = "path_to_output_file" result.write.format("csv").option("header", "true").save(output_path) ``` 7. **结束SparkSession**: 当所有操作完成之后,关闭SparkSession以释放资源。 ```python spark.stop() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zbxmc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值