5月9日
实验7
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”,然后统计出文件的行数;
(2)在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;
./bin/spark-shell
val textFile=sc.textFile("hdfs://node1:8020/user/hadoop/test.txt")
textFile.count()
(3)编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。
(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
代码
from pyspark import SparkContext
def merge_files(hdfs_file_a, hdfs_file_b, output_hdfs_file):
    sc = SparkContext("local", "Simple Example")
    # 读取 HDFS 输入文件
    rdd_a = sc.textFile(hdfs_file_a)
    rdd_b = sc.textFile(hdfs_file_b)
    # 合并两个 RDD
    merged_rdd = rdd_a.union(rdd_b)
    # 去重
    unique_rdd = merged_rdd.distinct()
    # 保存结果到 HDFS 输出文件
    unique_rdd.saveAsTextFile(output_hdfs_file)
    sc.stop()
# 输入文件路径
file_a = "hdfs://node1:8020/input/ShiYan/a.txt"
file_b = "hdfs://node1:8020/input/ShiYan/b.txt"
output_file = "hdfs://node1:8020/output/ShiYan/c"
merge_files(file_a, file_b, output_file)
(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)
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark import SparkConf
def calculate_average_scores(input_files, output_file):
    # 设置 Spark 配置,明确指定 HDFS
    conf = SparkConf().setAppName("Calculate Average Scores")
    conf.set("spark.hadoop.fs.defaultFS", "hdfs://node1:8020")
    # 创建 SparkContext 和 SparkSession
    sc = SparkContext(conf=conf)
    spark = SparkSession(sc)
    # 删除已存在的输出目录
    spark._jvm.org.apache.hadoop.fs.FileSystem.get(
        spark._jsc.hadoopConfiguration()).delete(
        spark._jvm.org.apache.hadoop.fs.Path(output_file), True)
    # 读取文件并合并
    rdds = [sc.textFile(file) for file in input_files]
    combined_rdd = sc.union(rdds)
    # 处理数据并计算平均分
    def parse_line(line):
        if "成绩" in line:
            return None
        parts = line.split()
        if len(parts) == 2:
            try:
                return (parts[0], float(parts[1]))
            except ValueError:
                return None
        return None
    scores_rdd = combined_rdd.map(parse_line).filter(lambda x: x is not None)
    # 计算总成绩和次数
    scores_sum_count = scores_rdd.combineByKey(
        lambda score: (score, 1),
        lambda acc, score: (acc[0] + score, acc[1] + 1),
        lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1])
    )
    # 计算平均成绩
    average_scores = scores_sum_count.mapValues(lambda x: round(x[0] / x[1], 2))
    # 将结果保存为文本文件
    average_scores.coalesce(1).saveAsTextFile(output_file)
    sc.stop()
input_files = [
    "hdfs://node1:8020/input/scores/Algorithm.txt",
    "hdfs://node1:8020/input/scores/Database.txt",
    "hdfs://node1:8020/input/scores/Python.txt"
]
output_file = "hdfs://node1:8020/output/average_scores"
calculate_average_scores(input_files, output_file)
4.实验报告
| 
 题目:  | 
 Spark初级编程实践  | 
 姓名  | 
 陈志峰  | 
 日期  | 
| 
 实验环境:Spark版本:2.4.0; Hadoop版本:3.1.3。  | 
||||
| 
 实验内容与完成情况:全部完成  | 
||||
| 
 出现的问题:无  | 
||||
| 
 解决方案(列出遇到的问题和解决办法,列出没有解决的问题):无  | 
||||
                    
                
                
            
        
浙公网安备 33010602011771号