spark3种方法 rdd df scs随机抽一个题一个方法 已建好RDD,DataFrame和临时表,直接写抽到题的分析代码: (1)大于95分的得分人次? (2)Tom选修的科目和考分? (3)有哪些选修课? (4)调整20%平时分 (5)每门课的选修人数,按选修人数排序 (6)每门课的平均分,按平均分排序。 (7)每个人的选修课数,平均分,总分 (8)Python考试的前10名 (9)Python课程80分以上的学生人数
时间: 2024-03-11 22:48:03 浏览: 61
spark: RDD与DataFrame之间的相互转换方法
随机抽到的题目是:计算每个人的选修课数,平均分,总分。
对应的代码如下:
1. RDD方法:
```python
# 已有rdd
# rdd格式:(学生编号, [(科目1, 报考情况, 成绩), (科目2, 报考情况, 成绩), ...])
# 例如:(1, [('English', 'required', 90), ('Math', 'elective', 85), ('History', 'required', 96)])
rdd.map(lambda x: (x[0], len(x[1]), sum([s[2] for s in x[1]]), sum([s[2] for s in x[1]]) / len(x[1)]) \
.sortBy(lambda x: x[0]) \
.collect()
```
2. DataFrame方法:
```python
# 已有dataframe
# dataframe格式:(学生编号, 科目, 报考情况, 成绩)
# 例如:
# +---+-------+-----------+-----+
# | id| subject|enrollment|score|
# +---+-------+-----------+-----+
# | 1|English| required| 90|
# | 1| Math| elective| 85|
# | 1|History| required| 96|
# +---+-------+-----------+-----+
from pyspark.sql.functions import count, sum, avg
df.groupBy('id').agg(count('subject').alias('选修课数'), sum('score').alias('总分'), avg('score').alias('平均分')) \
.orderBy('id') \
.collect()
```
3. Spark SQL方法:
```python
# 已有临时表
# 表名:students
# 字段:id, subject, enrollment, score
# 例如:
# +---+-------+-----------+-----+
# | id| subject|enrollment|score|
# +---+-------+-----------+-----+
# | 1|English| required| 90|
# | 1| Math| elective| 85|
# | 1|History| required| 96|
# +---+-------+-----------+-----+
spark.sql("SELECT id, COUNT(subject) AS 选修课数, SUM(score) AS 总分, AVG(score) AS 平均分 FROM students GROUP BY id ORDER BY id").show()
```
阅读全文