任务4.8.4 利用Spark SQL实现分组排行榜

文章目录

  • [1. 任务说明](#1. 任务说明)
  • [2. 解决思路](#2. 解决思路)
  • [3. 准备成绩文件](#3. 准备成绩文件)
  • [4. 采用交互式实现](#4. 采用交互式实现)
  • [5. 采用Spark项目](#5. 采用Spark项目)
  • [实战概述:使用Spark SQL实现分组排行榜](#实战概述:使用Spark SQL实现分组排行榜)
    • 任务背景
    • 任务目标
    • 技术选型
    • 实现步骤
      • [1. 准备数据](#1. 准备数据)
      • [2. 数据上传至HDFS](#2. 数据上传至HDFS)
      • [3. 启动Spark Shell或创建Spark项目](#3. 启动Spark Shell或创建Spark项目)
      • [4. 读取数据](#4. 读取数据)
      • [5. 数据转换](#5. 数据转换)
      • [6. 创建临时视图](#6. 创建临时视图)
      • [7. SQL查询实现分组排行榜](#7. SQL查询实现分组排行榜)
      • [8. 结果格式化输出](#8. 结果格式化输出)
      • [9. 运行程序并验证结果](#9. 运行程序并验证结果)
    • 代码实现
    • 结果展示
    • 总结

1. 任务说明

2. 解决思路

3. 准备成绩文件

4. 采用交互式实现

5. 采用Spark项目

实战概述:使用Spark SQL实现分组排行榜

任务背景

在教育数据分析领域,经常需要对学生的成绩进行分组和排名。本实战任务通过Apache Spark的Spark SQL模块,实现对学生成绩数据的分组,并求出每个学生分数最高的前3个成绩。

任务目标

  • 处理包含多个学生多条成绩记录的数据集。
  • 对每个学生的成绩进行分组,并计算每个学生最高的前3个成绩。
  • 以指定的格式输出每个学生的Top3成绩。

技术选型

  • 使用Apache Spark作为大数据处理框架。
  • 利用Spark SQL进行数据查询和操作。

实现步骤

1. 准备数据

  • 创建本地文件grades.txt,存储学生姓名和对应的成绩。

2. 数据上传至HDFS

  • 创建HDFS目录/topn/input
  • grades.txt上传至HDFS。

3. 启动Spark Shell或创建Spark项目

  • 启动Spark Shell或创建Maven项目并配置Spark相关依赖。

4. 读取数据

  • 使用Spark读取HDFS上的成绩文件,创建DataFrame。

5. 数据转换

  • 将单列DataFrame转换成包含namegrade的多列DataFrame。

6. 创建临时视图

  • 基于DataFrame创建SQL临时视图,以便进行SQL查询。

7. SQL查询实现分组排行榜

  • 使用窗口函数row_number()over()对每个学生的成绩进行降序排名,并筛选出排名前3的成绩。

8. 结果格式化输出

  • 将查询结果转换为元组,然后按学生姓名分组,格式化输出每个学生的Top3成绩。

9. 运行程序并验证结果

  • 执行Scala程序,查看输出的Top3成绩是否符合预期。

代码实现

以下是使用Scala编写的Spark程序示例,用于实现分组排行榜功能:

scala 复制代码
package net.huawei.sql

import org.apache.spark.sql.{SparkSession, functions}

object GradeTopN {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("SparkSQLGradeTopN")
      .master("local[*]")
      .getOrCreate()
    val df = spark.read.text("hdfs://master:9000/topn/input/grades.txt")
    val gradeDF = df.selectExpr("split(value, ' ') as (name, grade)")
      .withColumn("grade", functions.expr("cast(grade as int)"))
      .drop("value")
    gradeDF.createOrReplaceTempView("t_grade")
    val top3 = spark.sql(
      """
        SELECT name, grade
        FROM (
          SELECT name, grade,
          ROW_NUMBER() OVER (PARTITION BY name ORDER BY grade DESC) as rank
          FROM t_grade
        ) t
        WHERE t.rank <= 3
      """)
    top3.show()
    val result = top3.collect.map(row => (row.getString(0), row.getInt(1)))
    val grouped = result.groupBy(_._1)
    grouped.foreach { case (name, grades) =>
      println(s"$name: ${grades.map(_._2).mkString(" ")}")
    }
    spark.stop()
  }
}

结果展示

程序运行后,将输出每个学生的Top3成绩

复制代码
张三丰: 94 90 87
李孟达: 88 85 82
王晓云: 98 97 93

总结

本实战任务展示了如何使用Spark SQL对数据进行分组和TopN计算,这是大数据领域中常见的数据处理需求。通过Spark SQL的窗口函数,可以方便地实现复杂的数据分析任务。

相关推荐
howard20051 天前
4.2.5 Spark SQL 分区自动推断
spark sql·自动分区推断
howard20051 天前
4.2.4 Spark SQL 数据写入模式
spark sql·数据写入模式
howard20055 天前
4.8.1 利用Spark SQL实现词频统计
spark sql·词频统计
howard20055 天前
4.8.4 利用Spark SQL实现分组排行榜
spark sql·分组排行榜
howard20056 天前
4.2.3 Spark SQL 手动指定数据源
spark sql·手动指定数据源
howard20058 天前
4.1.1 Spark SQL概述
数据集·spark sql·数据帧
howard20058 天前
4.8.3 利用SparkSQL统计每日新增用户
spark sql·每月新增用户数
howard20058 天前
4.8.2 利用Spark SQL计算总分与平均分
spark sql·成绩统计
howard20059 天前
4.8.5 利用Spark SQL统计网站每月访问量
spark sql·网站每月访问量
IT成长日记1 个月前
【Hive入门】Hive与Spark SQL深度集成:执行引擎性能全面对比与调优分析
hive·sql·spark·性能分析·spark sql·执行引擎