实验二、SPARK基础编程方法

一、实验目的

理解SPARK工作流程;
掌握SPARK基础编程方法;

二、实验平台

操作系统:Linux(建议Ubuntu16.04);
Hadoop版本:2.7.1;
JDK版本:1.7或以上版本;
Java IDE:IDEA
spark版本:3.1.2
scala版本:2.12.10

三、实验内容

(一)、编写独立应用程序实现数据去重

对于两个输入文件A.txt 和 B.txt, 编写Spark独立应用程序(推荐使用Scala语言),对两个文件进行合并,并剔除其中重复的内容,得到一个新的文件C.txt。
输入文件 A.txt 的样例如下:
20170101 x
20170102 y
20170103 x
20170104 y
20170105 z
20170106 z

输入文件 B.txt 的样例如下:
20170101 y
20170102 y
20170103 x
20170104 z
20170105 y

根据输入的文件 A.txt 和 B.txt 合并得到的输出文件 C.txt 的样例如下:
20170101 x
20170101 y
20170102 y
20170103 x
20170104 y
20170104 z
20170105 y
20170105 z
20170106 z

(1)建立 input1 文件夹存放所要处理的文件。
(2)将 task1.scala 文件所在 project_one 项目打包成 jar,并将其复制到相关文件夹中,运行 project_one.jar,将结果存放在新文件夹 output1 中,如下图所示:
在这里插入图片描述
(3)查看运行结果,如下图所示:
在这里插入图片描述

程序代码:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner
object task1 {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("task2_1")
    val sc = new SparkContext(conf)
    val dataFile = "file:///home/XXX/input1/A.txt,file:///home/XXX/input1/B.txt" //XXX为本人用户名
    val res = sc.textFile(dataFile,2) .filter(_.trim().length>0).map(line=>(line.trim,"")).partitionBy(new
HashPartitioner(1)).groupByKey().sortByKey().keys
res.saveAsTextFile("file:///home/XXX/output1/result") //XXX为本人用户名
  }
}
(二)、编写独立应用程序实现求平均值问题

每个输入文件表示班级学生某个学科的成绩,每行内筒由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序(推荐使用Scala语言)求出所有学生的平均成绩,并输入到一个新文件中。

输入文件如下:
Algorithm.txt:
小明 92
小红 87
小新 82
小丽 90

Database.txt:
小明 95
小红 81
小新 89
小丽 85

Python.txt:
小明 82
小红 83
小新 94
小丽 91

输出平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)

基本步骤同上
程序代码:
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner
import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._

object task2 {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("AvgScore")
    val sc = new SparkContext(conf)
    val dataFile = "file:///home/XXX/input2/Algorithm.txt,file:///home/XXX/input2/Database.txt,file:///home/XXX/input2/Python.txt"  //XXX为自己用户名
    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("file:///home/XXX/output2/result")  //XXX为自己用户名
  }
}
运行结果:

在这里插入图片描述

(三)、对于文件people.txt, 该文件包含了序号、性别和身高三个列。

形式如下:
0 F 168
1 F 141
2 M 184
3 F 186…
编写Spark应用程序,计算得到男性总数、女性总数、男性最高身高、女性最高身高、男性最低身高、女性最低身高、男性平均升高、女性平均身高。

基本步骤同上
程序代码:
import org.apache.spark.HashPartitioner
import org.apache.spark.{SparkConf, SparkContext}

object task3 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setAppName(s"${task3.getClass.getSimpleName}")
      .setMaster("local[*]")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("file:///home/XXX/input3/people.txt") //XXX表示本人用户名
    val peopleInfo = lines.map(line => {
      val res = line.split("\\s+")
      if (res == null || res.length != 3) {
        null
      } else {
        val gender = res(1)
        val height = res(2).toDouble
        //返回性别与身高,过滤null值
        (gender, height)
      }
    }).filter(t => t != null)

    peopleInfo.map { case (gender, height) => {
      (gender, Result(gender, 1, height, height))
    }
      //比较两个对象的身高
    }.reduceByKey((res1, res2) => {
      val maxHeight = if (res1.maxHeight > res2.maxHeight) {
        res1.maxHeight
      } else res2.maxHeight
      val minHeight = if (res1.minHeight < res2.minHeight) {
        res1.minHeight
      } else res2.minHeight
      Result(res1.gender, res1.total + res2.total, maxHeight, minHeight)
    }).foreach(println)
    sc.stop()
  }
}

//根据需求定义一个模式匹配类
case class Result(gender: String, total: Int, maxHeight: Double, minHeight: Double) {
}
运行结果:

在这里插入图片描述

(四)、对于文件relationship.txt,数据形式示例如下:A<B,C,D,F,E,O,表示用户B,C,D,F,E,O关注了A,现要求分别计算每个用户被关注的数量以及每个用户关注的数量。
基本步骤同上
程序代码:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object task4 {
    def main(args: Array[String]): Unit = {
        val sc = new SparkContext(new SparkConf().setAppName("task4"))
        val dataFile = sc.textFile("file:///home/XXX/input4/relationship.txt")
        //被关注        
        val rdd1 = dataFile.map(x =>x.replaceAll("<",",").split(",")).filter(_.length > 0)
        val nag = rdd1.map(x=>{
                val person= x(0)
                val count1 = x.size - 1
                (person,count1)
        })
        //关注
        val rdd2 = dataFile.map(x =>x.split("<")(1)).filter(_.length > 0)
        val pos = rdd2.flatMap(line => line.split(","))
                        .map(x => (x,1))
                        .reduceByKey(_+_)//对key值相同的数据进行压缩

        nag.saveAsTextFile("file:///home/XXX/output4/result1") //XXX代表本人用户名
        pos.saveAsTextFile("file:///home/XXX/output4/result2")

  }
}
运行结果:

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实验5是关于Spark SQL编程初级实践的实验。在这个实验中,学习者将学习如何使用Spark SQL进行数据分析和处理。具体来说,学习者将学习如何使用Spark SQL进行数据的读取、转换、过滤和聚合等操作,以及如何使用Spark SQL进行数据可视化和报表生成等操作。此外,学习者还将学习如何使用Spark SQL进行数据的存储和管理,以及如何使用Spark SQL进行数据的优化和性能调优等操作。通过这个实验,学习者将掌握Spark SQL编程的基本技能,为进一步深入学习和应用Spark SQL打下坚实的基础。 ### 回答2: 实验5是一项关于Spark SQL编程的初级实践,主要涉及到Spark SQL的数据处理、聚合和分析操作。在这个实践中,我们使用了一些简单的Spark SQL语句,通过对一个示例数据集的分析和处理,来深入了解Spark SQL的基本操作和使用方法。 首先,我们通过读取示例数据集中的CSV文件,将数据加载到Spark SQL中,并将其注册为一个表。在这个步骤中,我们学习了如何使用Spark SQL中的数据读取器和数据格式化器,以及如何将数据转换为表格结构。接着,我们使用了一些简单的查询语句,来了解如何对数据进行筛选、排序和过滤操作。这些查询语句包括SELECT、WHERE、ORDER BY、LIMIT等命令,可以轻松地对数据进行简单的分析和处理。 接下来,我们使用了一些聚合和分析操作,对数据进行了更加深入的处理。在这个步骤中,我们学习了如何使用GROUP BY命令,对数据进行分组聚合,以及如何使用SUM、COUNT、AVG等函数,对数据进行计算和统计操作。通过这些操作,我们可以更加直观地了解数据的特征和规律,并得出一些有用的结论和建议。 最后,我们使用了一些高级的Spark SQL语句,对数据进行了更加复杂的处理和分析操作。例如,我们使用了JOIN命令,将多个数据表进行关联,并使用HAVING命令,对关联后的数据进行筛选和分析。这些高级操作可以更加深入地挖掘数据中的潜在价值和意义,为后续的数据分析和挖掘工作奠定了基础。 总的来说,实验5是一项非常有意义的初级实践,通过对Spark SQL的基本操作和使用方法的学习和实践,帮助我们更好地理解和掌握了这一强大的数据处理工具。在今后的数据分析和挖掘工作中,这些知识和技能将会派上大用场,成为我们掌握和应用大数据技术的重要基础。 ### 回答3: Spark SQL 是 Spark 中一个用于结构化数据处理的用例,提供了一种对结构化数据进行操作的 API。同时,Spark SQL 还支持许多 SQL 查询和类似数据操作的API,例如 DataFrame,DataSet 和 SQL 语言。 在本次实验中,我们学习了如何使用 Spark SQL 对数据进行操作。首先,我们需要将数据导入到 Spark 中。我们可以使用 Spark 中的 read 方法,从 CSV 文件、JSON 文件或 HDFS 文件系统中读取数据。将数据读入Spark DataFrame 后,我们可以使用 Spark SQL API 对数据进行过滤、聚合、分组等操作。 在这次实验中,我们通过读取 CSV 文件并创建 DataFrame,在 Spark SQL 中使用 SQL 语言对数据进行过滤和聚合操作。我们使用了 SELECT、WHERE、GROUP BY 和 ORDER BY 这些 SQL 命令来对数据进行查询和操作。在实验中,我们了解了如何使用 SQL 语句来进行数据操作,并且学习了如何使用 DataFrame 的 API 来完成相同的任务。 除了 SQL 语句和 DataFrame API,Spark SQL 还支持使用 Spark 自带的 Scala、Java 或 Python 语言来进行编程。我们还了解了在 Spark 中如何使用 Scala 语言进行编程,并通过框架提供的 API 执行了简单的任务。 在本次实验中,我们学习了操作结构化数据的重要性,并了解了使用 Spark SQL 对数据进行操作的基础知识。这个实验还为我们打下了在使用 Spark SQL 进行更深入学习的良好基础
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值