将本地路径/root/user下的文件chapter4-data01.txt创建成rdd,使用独立应用程序计算每门课的平均分,并显示输出;
时间: 2024-01-26 09:04:44 浏览: 66
首先需要读取文件,将其创建成为一个rdd对象,可以使用SparkContext中的`textFile()`方法读取文本文件,代码如下:
```python
from pyspark import SparkContext
sc = SparkContext("local", "chapter4")
data = sc.textFile("file:///root/user/chapter4-data01.txt")
```
接下来,我们需要将每行数据进行拆分,将每门课程的成绩提取出来,然后计算平均分。可以使用`map()`方法对rdd中的每个元素进行处理,代码如下:
```python
# 将每行数据拆分,提取出每门课程的成绩
scores = data.map(lambda line: line.split("\t")[1:])
# 计算每门课程的平均分
avg_scores = scores.map(lambda x: (x[0], float(x[1]))). \
aggregateByKey((0, 0), lambda a, b: (a[0] + b, a[1] + 1), lambda a, b: (a[0] + b[0], a[1] + b[1])). \
mapValues(lambda v: v[0] / v[1])
```
上述代码中,`scores`变量表示每门课程的成绩,使用`map()`方法将每行数据拆分,并提取出每门课程的成绩;`avg_scores`变量表示每门课程的平均分,使用`map()`方法将每个成绩转换成一个键值对`(课程名, 成绩)`,然后使用`aggregateByKey()`方法对每门课程的成绩进行合并和计算平均分。
最后,我们可以使用`collect()`方法取出所有结果,然后使用`foreach()`方法显示输出,代码如下:
```python
# 显示每门课程的平均分
for (subject, score) in avg_scores.collect():
print("{}的平均分:{}".format(subject, round(score, 2)))
```
上述代码中,使用`collect()`方法将所有结果取出来,并使用`foreach()`方法遍历每个元素,然后将结果显示输出。其中,`round()`方法用于保留两位小数。
阅读全文