码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 任务4.8.4 利用Spark SQL实现分组排行榜


    文章目录

    • 1. 任务说明
    • 2. 解决思路
    • 3. 准备成绩文件
    • 4. 采用交互式实现
    • 5. 采用Spark项目
    • 实战概述:使用Spark SQL实现分组排行榜
      • 任务背景
      • 任务目标
      • 技术选型
      • 实现步骤
        • 1. 准备数据
        • 2. 数据上传至HDFS
        • 3. 启动Spark Shell或创建Spark项目
        • 4. 读取数据
        • 5. 数据转换
        • 6. 创建临时视图
        • 7. SQL查询实现分组排行榜
        • 8. 结果格式化输出
        • 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转换成包含name和grade的多列DataFrame。

    6. 创建临时视图

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

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

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

    8. 结果格式化输出

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

    9. 运行程序并验证结果

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

    代码实现

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

    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的窗口函数,可以方便地实现复杂的数据分析任务。

  • 相关阅读:
    Gitea+Jenkins+webhooks-多分支触发+备份构建前端资源
    糖尿病患者饮食该注意些什么
    前端性能优化:页面加载速度慢怎么办?
    Vision-Dialog Navigation和Vision-and-Language Navigation简单总结
    快速用Python进行数据分析技巧详解
    使用Mapster实现双向映射,解放搬砖体力活
    node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)
    Kubernetes技术与架构(八)
    2019年Java面试题汇总
    Py使用requests爬虫1(基础+入门)
  • 原文地址:https://blog.csdn.net/howard2005/article/details/139887268
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号