12.28 Spark初级编程实践
1.实验目的
(1)掌握使用Spark访问本地文件和HDFS文件的方法
(2)掌握Spark应用程序的编写、编译和运行方法
2.实验平台
(1)操作系统:Ubuntu18.04(或Ubuntu16.04);
(2)Spark版本:2.4.0;
(3)Hadoop版本:3.1.3。
3.实验步骤
(1)Spark读取文件系统的数据
(1)在spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;
val localFile = sc.textFile("/home/hadoop/test.txt")
val lineCount = localFile.count()
println(s"文件行数: $lineCount")
(2)在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;
val hdfsFile = sc.textFile("hdfs://localhost:9000/user/hadoop/test.txt")
val hdfsLineCount = hdfsFile.count()
println(s"HDFS文件行数: $hdfsLineCount")
(3)编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。
import org.apache.spark.sql.SparkSession
object CountLines {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.appName("Count Lines").getOrCreate()
val hdfsFile = spark.sparkContext.textFile("hdfs://localhost:9000/user/hadoop/test.txt")
val lineCount = hdfsFile.count()
println(s"HDFS文件行数: $lineCount")
spark.stop()
}
}
sbt package
spark-submit --class CountLines target/scala-2.12/your-jar-name.jar
(2)编写独立应用程序实现数据去重
对于两个输入文件A和B,编写Spark独立应用程序(推荐使用Scala语言),对两个文件进行合并,并剔除其中重复的内容,得到一个新文件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
import org.apache.spark.sql.SparkSession
object RemoveDuplicates {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.appName("Remove Duplicates").getOrCreate()
val fileA = spark.sparkContext.textFile("hdfs://localhost:9000/user/hadoop/fileA.txt")
val fileB = spark.sparkContext.textFile("hdfs://localhost:9000/user/hadoop/fileB.txt")
val combined = fileA.union(fileB).distinct().sortBy(line => line.split("\t")(0))
combined.saveAsTextFile("hdfs://localhost:9000/user/hadoop/outputC.txt")
spark.stop()
}
}
(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.sql.SparkSession
object CalculateAverage {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.appName("Calculate Average").getOrCreate()
val files = List("hdfs://localhost:9000/user/hadoop/Algorithm.txt",
"hdfs://localhost:9000/user/hadoop/Database.txt",
"hdfs://localhost:9000/user/hadoop/Python.txt")
val scores = spark.sparkContext.textFile(files.mkString(","))
.map(line => {
val parts = line.split(" ")
(parts(0), parts(1).toDouble)
})
val totalScores = scores
.groupByKey()
.mapValues(scores => scores.sum / scores.size)
totalScores.saveAsTextFile("hdfs://localhost:9000/user/hadoop/average_scores.txt")
spark.stop()
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异