引自免费微信小程序:皆我百晓生
在Spark DataFrame中,我们可以使用mapValues()
函数和minBy()
、maxBy()
等函数来实现对多个列进行计数统计和计算平均值、最低值和最高值的操作。以下是一个示例:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
// 假设我们有一个名为"grades"的DataFrame,其中包含以下列:ID (String类型),Gender (String type),Chinese (Integer type), English (Integer type), Math (Integer type)
val grades = Seq(
("301610", "Male", 80, 64, 78),
("301611", "Female", 65, 87, 58),
("301612", "Female", 44, 71, 77),
("301613", "Female", 66, 71, 91),
("301614", "Female", 70, 71, 100),
("301615", "Male", 72, 77, 72),
("301616", "Female", 73, 81, 75),
("301617", "Female", 69, 77, 75),
("301618", "Male", 73, 61, 65)
)
// 计算每个学生的总分
val totalGrades = grades.mapValues(_.length).sum
// 计算各科目的平均分
val averageChinese = totalGrades / grades.count(_.contains("Chinese"))
val averageEnglish = totalGrades / grades.count(_.contains("English"))
val averageMath = totalGrades / grades.count(_.contains("Math"))
// 计算各科目的最低分
val minChinese = totalGrades.minBy(_.length)
val minEnglish = totalGrades.minBy(_.contains("English"))
val minMath = totalGrades.minBy(_.contains("Math"))
// 计算各科目的最高分
val maxChinese = totalGrades.maxBy(_.length)
val maxEnglish = totalGrades.maxBy(_.contains("English"))
val maxMath = totalGrades.maxBy(_.contains("Math"))
// 打印结果
println("Total scores:")
println(totalGrades)
println("\nAverage Chinese score:")
println(averageChinese)
println("\nAverage English score:")
println(averageEnglish)
println("\nAverage Math score:")
println(averageMath)
println("\nMin Chinese score:")
println(minChinese)
println("\nMin English score:")
println(minEnglish)
println("\nMin Math score:")
println(minMath)
println("\nMax Chinese score:")
println(maxChinese)
println("\nMax English score:")
println(maxEnglish)
println("\nMax Math score:")
println(maxMath)
这段代码首先使用mapValues()
函数将每个学生的成绩转换为长度(即总分),然后使用sum()
函数计算所有学生总分的总和。接下来,它通过遍历评分表中的每个成绩,使用minBy()
、maxBy()
等函数计算对应的科目的平均分、最低分和最高分。最后,它打印出各个科目的总分、平均分、最低分和最高分,并显示了它们的最小值、最大值和各自对应的ID。
注意:这个示例假设所有的成绩都是整数,且"gender"列对应的是学生是否为男生。如果你的数据格式不同,可能需要修改这些函数的输入和输出类型。例如,在某些情况下,可能需要处理非整数的学号或成绩,或者需要区分不同的性别类别。同样,由于"grades"表包含了大量的记录,你可能需要考虑并优化查询速度和空间需求,特别是在处理大量数据时。