08 学生课程分数的Spark SQL分析

读学生课程分数文件chapter4-data01.txt,创建DataFrame。

一、用DataFrame的操作完成以下数据分析要求

  • 每个分数+5分。

  • 总共有多少学生?
  • 总共开设了哪些课程?
  • 每个学生选修了多少门课?
  • 每门课程有多少个学生选?
  • 每门课程大于95分的学生人数?
  • Tom选修了几门课?每门课多少分?
  • Tom选修了几门课?每门课多少分?
  • Tom的成绩按分数大小排序。
  • Tom的平均分。
  •  

     

  • 求每门课的平均分,最高分,最低分。
  •  

     

  • 求每门课的选修人数及平均分,精确到2位小数。
  •  

     

  • 每门课的不及格人数,通过率
  •  

     

 

 

 

二、用SQL语句完成以上数据分析要求,可叠加RDD操作。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、对比分别用RDD操作实现、用DataFrame操作实现和用SQL语句实现的异同。(比较两个以上问题)

总共有多少学生?

rdd操作

DataFrame操作

SQL语句实现

 

 每个学生选修了多少门课?

 rdd操作

DataFrame操作

SQL语句实现

 

 求每门课的选修人数及平均分。

 rdd操作

 

DataFrame操作

SQL语句实现

 

 

四、结果可视化。

 

转换

from pyspark.sql.types import IntegerType, StringType, StructField, StructType

fields = [StructField(...), ...]

schema = StructType(fields)

 类型:http://spark.apache.org/docs/latest/sql-ref-datatypes.html 

from pyspark.sql import Row

data = rdd.map(lambda p: Row(...))

操作 

Spark SQL DataFrame 操作

df.show()

df.printSchema()

df.count()

df.head(3)

df.collect()

df[‘name’]

df.name

df.first().asDict()

df.describe().show()

df.distinct()

df.filter(df['age'] > 21).show()

df.groupBy("age").count().show()

df.select('name', df['age‘] + 1).show()

df_scs.groupBy("course").avg('score').show()

 df_scs.agg({"score": "mean"}).show()

df_scs.groupBy("course").agg({"score": "mean"}).show()

 函数:http://spark.apache.org/docs/2.2.0/api/python/pyspark.sql.html#module-pyspark.sql.functions 

SQL

必须把DataFrame注册为临时表

df_scs.createOrReplaceTempView("scs")

spark.sql(“SQL语句")

结果是DataFrame

DataFrame.rdd 转换成RDD

spark.sql("SELECT * FROM scs where name=='Tom'").rdd.map(lambda x:x.course ).collect()

 

 DataFrame连接

df1.join(df2, "course").show()

DataFrame拼接

df1.unionAll(df2).show()

sql表连接

spark.sql("select * from a left join b on a.course=b.course").show()

 

 

posted @ 2021-05-24 21:06  无可奈何花落  阅读(106)  评论(0编辑  收藏  举报