SparkSQL数据模型综合实践

文章目录

  • 1. 实战概述
  • 2. 实战步骤
    • 2.1 创建数据集
    • 2.2 创建数据模型对象
      • 2.2.1 创建常量
      • 2.2.2 创建加载数据方法
      • 2.2.3 创建过滤年龄方法
      • 2.2.4 创建平均薪水方法
      • 2.2.5 创建主方法
      • 2.2.6 查看完整代码
    • 2.3 运行程序,查看结果
  • 3. 实战小结

1. 实战概述

  • 在本次实战中,创建一个名为DataModelSpark SQL数据模型对象,用于演示如何加载数据集、过滤数据以及计算统计信息。首先,在项目根目录下创建data目录,并在其中创建了包含员工信息的employees.json文件。然后,创建DataModel对象,并定义spark常量以及三个方法:loadData()filterAge()avgSalary(),分别用于加载数据、过滤年龄大于20岁的员工和计算不同性别的平均工资。最后,在main()方法中调用这些方法来执行数据处理任务。

2. 实战步骤

2.1 创建数据集

  • 在项目根目录创建data目录
    在这里插入图片描述
  • data里创建employees.json
    在这里插入图片描述
{"name": "赵天宇", "gender": "男", "age": "19", "salary": "10000"}
{"name": "钱文博", "gender": "男", "age": "29", "salary": "8000"}
{"name": "孙志强", "gender": "男", "age": "39", "salary": "9000"}
{"name": "李明宇", "gender": "男", "age": "22", "salary": "11000"}
{"name": "周雨涵", "gender": "女", "age": "19", "salary": "14000"}
{"name": "吴美琪", "gender": "女", "age": "35", "salary": "10000"}

2.2 创建数据模型对象

  • 创建net.huawei.practice
    在这里插入图片描述

  • practice子包里创建DataModel对象
    在这里插入图片描述

2.2.1 创建常量

  • DataModel对象里创建spark常量
    在这里插入图片描述
// 获取或创建Spark会话对象                                  
val spark = SparkSession.builder() // 创建Builder对象  
  .appName("DataModel") // 设置应用程序名称                
  .master("local[*]") // 运行模式:本地运行                 
  .getOrCreate() // 获取或创建Spark会话对象                 

2.2.2 创建加载数据方法

  • loadData()方法的需求说明:其主要功能是加载指定路径的文件并生成 DataFrame。方法接受一个字符串类型的参数 filePath,表示文件的路径。执行流程包括使用 spark.read.json(filePath) 方法读取 JSON 文件并创建 DataFrame,然后将生成的 DataFrame 返回给调用者。此方法简化了从文件加载数据到 DataFrame 的过程,提高了数据处理的效率和便捷性。

  • 创建loadData()方法
    在这里插入图片描述

// 加载数据方法                                                
def loadData(): DataFrame = {                            
  // 加载数据得到数据帧对象                                         
  val fileDF = spark.read.json("data/employees.json")    
  // 返回数据帧对象                                             
  fileDF                                                 
}                                                        

2.2.3 创建过滤年龄方法

  • filterAge() 方法的需求说明:该方法用于过滤 DataFrame 中年龄大于20岁的数据,并将结果打印到控制台。方法接受一个 DataFrame 类型的参数 employeeDF,表示原始 JSON 文件对应的 DataFrame 实例对象。方法不返回任何值(返回类型为 Unit)。核心思路包括使用 DataFrame 的 filter 方法根据条件过滤数据,然后使用 show 方法打印过滤后的结果。此方法简化了数据过滤和展示的过程,有助于快速分析和查看特定条件下的数据。
  • 创建filterAge()方法
    在这里插入图片描述
// 过滤年龄方法                                           
def filterAge(employeeDF: DataFrame): Unit = {      
  // 过滤年龄大于20岁的员工                                   
  val filterAgeDF = employeeDF.filter("age > 20")   
  // 显示过滤后的数据                                       
  filterAgeDF.show()                                
}                                                   

2.2.4 创建平均薪水方法

  • avgSalary() 方法,其需求是计算并打印 DataFrame 中不同性别的平均收入。方法接受一个 DataFrame 类型的参数 employeeDF,表示原始 JSON 文件对应的 DataFrame 实例对象。方法不返回任何值(返回类型为 Unit)。核心思路包括使用 createOrReplaceTempView 方法将 DataFrame 注册为临时表,然后通过 SQL 查询计算不同性别的平均收入,最后使用 show 方法将结果打印到控制台。此方法简化了数据处理流程,有助于快速分析和展示特定统计信息。
  • 创建avgSalary()方法
    在这里插入图片描述
// 计算平均工资方法                                              
def avgSalary(employeeDF: DataFrame): Unit = {           
  // 根据输入参数注册临时表                                         
  employeeDF.createOrReplaceTempView("employee")         
  // 计算平均工资                                              
  val avgSalaryDF = spark.sql(                           
    s"""                                                 
       |SELECT                                           
       |  gender, avg(salary) AS avg_salary                 
       |FROM                                             
       |  employee                                       
       |GROUP BY                                         
       |  gender                                         
       |""".stripMargin                                  
  )                                                      
  // 显示平均工资                                              
  avgSalaryDF.show()                                     
}                                                        

2.2.5 创建主方法

  • main() 方法,该方法是程序的入口点,用于调用 filterAgeavgSalary 方法。main 方法接受一个 Array[String] 类型的参数 args,这些参数可以在程序执行时从外部传递,使得程序能够动态使用这些参数而无需修改代码。main 方法不返回任何值(返回类型为 Unit)。业务代码的核心思路是首先调用 loadData() 方法加载数据,然后将返回的 DataFrame 传递给 filterAgeavgSalary 方法进行处理。这种方法结构清晰,便于管理和扩展程序功能。
  • 创建main()方法
    在这里插入图片描述
// 主方法                                     
def main(args: Array[String]): Unit = {    
  // 调用过滤年龄方法                              
  filterAge(loadData())                    
  // 调用计算平均工资方法                            
  avgSalary(loadData())                    
}                                          

2.2.6 查看完整代码

package net.huawei.practice

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

/**
 * 功能:数据模型演示
 * 作者:华卫
 * 日期:2025年01月16日
 */
object DataModel {
  // 获取或创建Spark会话对象
  val spark = SparkSession.builder() // 创建Builder对象
    .appName("DataModel") // 设置应用程序名称
    .master("local[*]") // 运行模式:本地运行
    .getOrCreate() // 获取或创建Spark会话对象

  // 加载数据方法
  def loadData(): DataFrame = {
    // 加载数据得到数据帧对象
    val fileDF = spark.read.json("data/employees.json")
    // 返回数据帧对象
    fileDF
  }

  // 过滤年龄方法
  def filterAge(employeeDF: DataFrame): Unit = {
    // 过滤年龄大于20岁的员工
    val filterAgeDF = employeeDF.filter("age > 20")
    // 显示过滤后的数据
    filterAgeDF.show()
  }

  // 计算平均工资方法
  def avgSalary(employeeDF: DataFrame): Unit = {
    // 根据输入参数注册临时表
    employeeDF.createOrReplaceTempView("employee")
    // 计算平均工资
    val avgSalaryDF = spark.sql(
      s"""
         |SELECT
         |  gender, avg(salary) AS avg_salary
         |FROM
         |  employee
         |GROUP BY
         |  gender
         |""".stripMargin
    )
    // 显示平均工资
    avgSalaryDF.show()
  }

  // 主方法
  def main(args: Array[String]): Unit = {
    // 调用过滤年龄方法
    filterAge(loadData())
    // 调用计算平均工资方法
    avgSalary(loadData())
  }
}

2.3 运行程序,查看结果

  • 运行DataModel对象
    在这里插入图片描述

3. 实战小结

  • 在本次拓展练习中,我们通过创建一个 SparkSQL 数据模型综合实践项目,深入理解了 Spark 中的数据模型和数据处理流程。首先,我们在项目根目录下创建了 data 目录,并在其中创建了 employees.json 文件,用于存储员工数据。接着,我们创建了 DataModel 对象,并在其中定义了 spark 常量和三个方法:loadData()filterAge()avgSalary(),分别用于加载数据、过滤年龄大于20岁的员工和计算不同性别的平均薪水。在 main() 方法中,我们调用了这些方法来执行数据处理任务。通过这个练习,我们不仅学会了如何在 Spark 中操作 DataFrame,还学会了如何将数据处理逻辑封装成方法,提高了代码的可读性和可维护性。此外,我们还学会了如何使用 SQL 查询来分析数据,这在处理结构化数据时非常有用。总的来说,这个练习帮助我们更好地理解了 SparkSQL 的数据模型和数据处理流程,为今后的数据处理工作打下了坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过电光晶体的电光效应,实现白光干涉中的电光调制相移原理

通过电光晶体的电光效应,实现白光干涉中的电光调制相移原理,是一个基于物理光学和电光学原理的高级测量技术。以下是对这一原理的详细解释: 一、电光效应与电光晶体 电光效应是指某些材料(主要是晶体)在外加电场的作…

基于Python的多元医疗知识图谱构建与应用研究(上)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…

logback日志自定义占位符

前言 在大型系统运维中,很大程度上是需要依赖日志的。在java大型web工程中,一般都会使用slf4jlogback这一个组合来实现日志的管理。 logback中很多现成的占位符可以可以直接使用,比如线程号【%t】、时间【%d】、日志等级【%p】,…

嵌入式知识点总结 C/C++ 专题提升(一)-关键字

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.C语言宏中"#“和"##"的用法 1.1.(#)字符串化操作符 1.2.(##)符号连接操作符 2.关键字volatile有什么含意?并举出三个不同的例子? 2.1.并行设备的硬件寄存…

嵌入式Linux驱动开发之platform

关键词:rk3399 嵌入式驱动 Linux platform 前言 前面的嵌入式Linux驱动都是描述从特定的SOC与特定设备之间的直接两两通信。而Linux不是为单一某一SOC结构而设计的操作系统,它可以运行在X86、ARM等多种架构多种SOC平台上,如果驱动程序按照S…

KubeSphere部署安装,接入KubeKey安装的k8s集群

KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…

从密码学原理与应用新方向到移动身份认证与实践

相关学习资料放下面啦! 记得关注❤️~后续分享更多资料 通过百度网盘分享的文件:从密码学原理与应... 链接https://pan.baidu.com/s/1mHpHkvPuf8DUwReQkoYQlw?pwdGza7 提取码:Gza7 复制这段内容打开「百度网盘APP 即可获取」 记…

Java 特殊文件、 properties文件、xml文件

一. 属性文件.properties 1. #注释 2. 内容都是一些键值对信息,每行都是一个键值对;键不能重复; 3. 属性文件的后缀一般都是properties结尾 4. 使用程序读取properties属性文件里面的数据 (1) Properties:是一个Map集合(键值对集合…

抽象设计如何提升用户体验?

抽象设计在网页设计中可以通过多种方式提升用户体验,以下是具体的应用和作用: 一、增强视觉吸引力 视觉冲击力:抽象元素往往具有强烈的视觉冲击力,能够迅速吸引用户的注意力。通过大胆的色彩、不寻常的形状和丰富的纹理&#xff…

MATLAB中while循环例子,for循环嵌套例子

while循环例子 for循环解决斐波那契数列 for循环嵌套例子 注意最后都有 e n d end end

行人识别检测数据集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的标注都支持,准确识别率可达99.5%

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C,go等语言开发经验,mysql,mongo,redis等数据库,设计模…

【vitePress】基于github快速添加评论功能(giscus)

一.添加评论插件 使用giscus来做vitepress 的评论模块,使用也非常的简单,具体可以参考:giscus 文档,首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档,如下图所示,填入你的 github 用户…

JAVA使用自定义注解,在项目中实现EXCEL文件的导出

首先定义一个注解 Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface Excel {/*** 导出时在excel中排序*/int sort() default Integer.MAX_VALUE;/*** 导出到Excel中的名字.*/String name() default "";/*** 首行字段的批注*/String …

有限元分析学习——Anasys Workbanch第一阶段笔记(14)静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立

目录 0 序言 1 静定与超静定问题 2 Workbranch中Supports介绍 3 简支梁挠度的有限元求解 4 自定义材料库建立 0 序言 静定与超静定问题、约束类型介绍、简支梁挠度求解和自定义材料库建立(内容对应视频22到24课)。 1 静定与超静定问题 在有限元分析中,不同的…

领域算法 - 大数据处理

大数据处理 文章目录 大数据处理一:hash分流二:双层桶1:什么是双层桶2:双层桶案例 三:外排序1:经典问题2:位图排序法3:多路归并排序 四:bitMap1:添加 -> 异…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压,通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块(ad_10bit_to_16bit):为了方便数据传输,数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

JavaWeb 快速入门 javaScript(预测爆文) | 019

今日推荐语 人经常推翻自己,经常不同意昨天的自己,这也是常态。——纪静蓉 日期 学习内容 打卡编号2025年01月20日JavaWeb快速入门javaScript019 前言 哈喽,我是菜鸟阿康。 今天大概学习了下 js 的的基础知识,js …

[c语言日寄]内存初阶:大端字节序和小端字节序

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

【MySQL】数据库-图书管理系统(CC++实现)

一.预期功能 该图书管理系统设计提供基本的设计模版,涉及数据库的增删查改等操作,包含登录功能,图书管理功能,图书借阅功能,用户管理功能等基础功能,详细功能查看以下菜单表,共包含三个菜单&am…

Linux-C/C++--深入探究文件 I/O (下)(文件共享、原子操作与竞争冒险、系统调用、截断文件)

经过上一章内容的学习,了解了 Linux 下空洞文件的概念;open 函数的 O_APPEND 和 O_TRUNC 标志;多次打开同一文件;复制文件描述符;等内容 本章将会接着探究文件IO,讨论如下主题内容。  文件共享介绍&…