实验五 Spark SQL编程初级实践

news2025/1/16 11:15:45

Spark SQL编程初级实践

  • Spark SQL基本操作

将下列JSON格式数据复制到Linux系统中,并保存命名为employee.json。

{ "id":1 , "name":" Ella" , "age":36 }

{ "id":2, "name":"Bob","age":29 }

{ "id":3 , "name":"Jack","age":29 }

{ "id":4 , "name":"Jim","age":28 }

{ "id":4 , "name":"Jim","age":28 }

{ "id":5 , "name":"Damon" }

{ "id":5 , "name":"Damon" }

为employee.json创建DataFrame,并写出Scala语句完成下列操作:

  1. 查询所有数据;
  2. 查询所有数据,并去除重复的数据;
  3. 查询所有数据,打印时去除id字段;
  4. 筛选出age>30的记录;
  5. 将数据按age分组;
  6. 将数据按name升序排列;
  7. 取出前3行数据;
  8. 查询所有记录的name列,并为其取别名为username;
  9. 查询年龄age的平均值;
  10. 查询年龄age的最小值。

  • 编程实现将RDD转换为DataFrame

源文件内容如下(包含id,name,age):

1,Ella,36

2,Bob,29

3,Jack,29

将数据复制保存到Linux系统中,命名为employee.txt,实现从RDD转换得到DataFrame,并按“id:1,name:Ella,age:36”的格式打印出DataFrame的所有数据。请写出程序代码。

  • 编程实现利用DataFrame读写MySQL的数据

(1)在MySQL数据库中新建数据库sparktest,再创建表employee,包含如表6-2所示的两行数据。

表6-2 employee表原有数据

id

name

gender

Age

1

Alice

F

22

2

John

M

25

(2)配置Spark通过JDBC连接数据库MySQL,编程实现利用DataFrame插入如表6-3所示的两行数据到MySQL中,最后打印出age的最大值和age的总和。

表6-3 employee表新增数据

id

name

gender

age

3

Mary

F

26

4

Tom

M

23

实验一 :Spark SQL基本操作

1)
// 导入必要的库
import org.apache.spark.sql.SparkSession

// 创建SparkSession
val spark = SparkSession.builder()
  .appName("Spark SQL Basic Operations")
  .getOrCreate()

// 读取JSON文件创建DataFrame
 	val df = spark.read.json("file:///home/hadoop/employee.json")
          // (1) 查询所有数据
df.show()
(2)查询所有数据,并去除重复的数据
df.distinct().show()

(3)
查询所有数据,打印时去除id字段
df.drop("id").show()

(4)
筛选出age>30的记录
df.filter("age > 30").show()

(5)
将数据按age分组
df.groupBy("age").count().show()


(6)
将数据按name升序排列
df.orderBy("name").show()


(7)
取出前3行数据
df.limit(3).show()

(8)
查询所有记录的name列,并为其取别名为username
df.select($"name".alias("username")).show()

(9)
查询年龄age的平均值
df.selectExpr("avg(age)").show()

(10)
查询年龄age的最小值
df.selectExpr("min(age)").show()

实验二 :编程实现将RDD转换为DataFrame

编程代码:

import org.apache.spark.sql.{SparkSession, Row}  
import org.apache.spark.sql.types._  
  
object RDDToDataFrameExample {  
  def main(args: Array[String]): Unit = {  
    // 创建SparkSession  
    val spark = SparkSession.builder()  
      .appName("RDD to DataFrame Example")  
      .master("local[*]") // 使用本地模式,如果连接到集群请更改这里  
      .getOrCreate()  
  
    import spark.implicits._  
  
    // 指定employee.txt文件的位置  
    val inputFilePath = "file:///home/hadoop/employee.txt"  
  
    // 从文本文件读取数据创建RDD  
    val rdd = spark.sparkContext.textFile(inputFilePath)  
  
    // 定义DataFrame的schema  
    val schema = StructType(Array(  
      StructField("id", IntegerType, nullable = false),  
      StructField("name", StringType, nullable = false),  
      StructField("age", IntegerType, nullable = false)  
    ))  
  
    // 将RDD转换为DataFrame  
    val dataFrame = spark.createDataFrame(rdd.map { line =>  
      val parts = line.split(",")  
      Row(parts(0).toInt, parts(1), parts(2).toInt)  
    }, schema)  
  
    // 显示DataFrame内容  
    dataFrame.show(false)  
  
    // 按照指定格式打印所有数据  
    dataFrame.collect().foreach { row =>  
      println(s"id:${row.getAs[Int]("id")},name:${row.getAs[String]("name")},age:${row.getAs[Int]("age")}")  
    }  
  
    // 停止SparkSession  
    spark.stop()  
  }  
}

 命令

/usr/local/spark-3.5.1/bin/spark-submit --class "RDDToDataFrameExample" ./target/scala-2.12/simple-project_2.12-1.9.0.jar

 具体操作参考博客

如何安装sbt(sbt在ubuntu上的安装与配置)(有详细安装网站和图解)-CSDN博客

实验三:编程实现利用DataFrame读写MySQL的数据

mysql代码

CREATE DATABASE sparktest;  
USE sparktest;  
  
CREATE TABLE employee (  
  id INT PRIMARY KEY,  
  name VARCHAR(50),  
  gender CHAR(1),  
  age INT  
);  
  
INSERT INTO employee (id, name, gender, age) VALUES (1, 'Alice', 'F', 22);  
INSERT INTO employee (id, name, gender, age) VALUES (2, 'John', 'M', 25);

如何安装msyql参考博客

 在ubuntu上安装mysql(在线安装需要)-CSDN博客

如何安装mysl驱动程序jar包-CSDN博客

编程代码

import org.apache.spark.sql.{SparkSession, Row}  
import java.util.Properties  
import org.apache.spark.sql.SparkSession  
import org.apache.spark.sql.Dataset  
import org.apache.spark.sql.Row  
import org.apache.spark.sql.functions.max  
import org.apache.spark.sql.functions.sum  
  
object MySQLDataFrameExample {  
  def main(args: Array[String]): Unit = {  
    // 创建SparkSession  
    val spark = SparkSession.builder()  
      .appName("MySQL DataFrame Example")  
      .master("local[*]") // 使用本地模式,如果连接到集群请更改这里  
      .getOrCreate()  
  
    import spark.implicits._  
  
    // 配置MySQL JDBC连接  
    val jdbcProperties = new Properties()  
    jdbcProperties.setProperty("user", "root")  
    jdbcProperties.setProperty("password", "mysql")  
    jdbcProperties.setProperty("driver", "com.mysql.cj.jdbc.Driver")  
  
    // 定义MySQL的JDBC连接URL  
    val jdbcUrl = "jdbc:mysql://localhost:3306/sparktest"  
  
    // 创建DataFrame以插入数据  
    val newEmployeeData = Seq(  
      (3, "Mary", "F", 26),  
      (4, "Tom", "M", 23)  
    ).toDF("id", "name", "gender", "age")  
  
    // 将DataFrame数据插入到MySQL的employee表中  
    newEmployeeData.write  
      .mode("append") // 使用append模式来添加数据,而不是覆盖  
      .jdbc(jdbcUrl, "employee", jdbcProperties)  
  
    // 从MySQL读取employee表的数据  
    val employeeDF = spark.read  
      .jdbc(jdbcUrl, "employee", jdbcProperties)  
  
    // 打印age的最大值  
    val maxAge = employeeDF.agg(max("age")).collect()(0).getAs[Int](0)  
    println(s"Max age: $maxAge")  
  
    // 打印age的总和  
    val sumAge = employeeDF.agg(sum("age")).collect()(0).getAs[Long](0)  
    println(s"Sum of ages: $sumAge")  
  
    // 停止SparkSession  
    spark.stop()  
  }  
}

编程详细步骤参考

 如何安装sbt(sbt在ubuntu上的安装与配置)(有详细安装网站和图解)-CSDN博客

 运行命令

/usr/local/spark-3.5.1/bin/spark-submit --jars /home/hadoop/mysql-connector-j-8.3.0/mysql-connector-j-8.3.0.jar  --class "MySQLDataFrameExample" ./target/scala-2.12/simple-project_2.12-1.9.0.jar

产生错误

主要问题都在实验三中,因为实验三中涉及到一个mysql数据库连接

命令更新为

/usr/local/spark-3.5.1/bin/spark-submit --jars /home/hadoop/mysql-connector-j-8.3.0/mysql-connector-j-8.3.0.jar  --class "MySQLDataFrameExample" ./target/scala-2.12/simple-project_2.12-1.9.0.jar

加了一个mysl驱动的jar的引用

如何安装mysql驱动参考博客

如何安装mysl驱动程序jar包-CSDN博客

打包失败

这个问题是代码错误

代码未引入一些包

加上下面这些就可以了

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

import java.util.Properties  

import org.apache.spark.sql.SparkSession  

import org.apache.spark.sql.Dataset  

import org.apache.spark.sql.Row  

import org.apache.spark.sql.functions.max  

import org.apache.spark.sql.functions.sum  

运行失败

未引入mysl驱动程序

要下载mysql驱动

采用命令引入

/usr/local/spark-3.5.1/bin/spark-submit --jars /home/hadoop/mysql-connector-j-8.3.0/mysql-connector-j-8.3.0.jar  --class "MySQLDataFrameExample" ./target/scala-2.12/simple-project_2.12-1.9.0.jar

参考链接

如何安装sbt(sbt在ubuntu上的安装与配置)(有详细安装网站和图解)-CSDN博客

在ubuntu上安装mysql(在线安装需要)-CSDN博客

在ubuntu上安装mysql(在线安装需要)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

婴儿专用洗衣机有必要吗?四大宝藏婴儿洗衣机测评对比

对于有了宝宝的家庭来说,洗衣成为了一项重要的家务事。大家都知道,宝宝的皮肤比较娇嫩,容易受到各种细菌、病毒的侵扰。所以,宝宝的衣物应该与大人的分开洗。婴儿洗衣机作为一种专门为婴幼儿家庭设计的洗衣机,其具有除…

Ubuntu 20.04.6下载、安装

一、下载 下载地址:https://cn.ubuntu.com/download 下载版本:ubuntu-20.04.6-desktop-amd64.iso 二、安装 参考博客: https://blog.csdn.net/lhl_blog/article/details/123406322 https://www.cnblogs.com/fieldtianye/p/17879840.html…

根据当年节假日和非工作时间计算请假时间-获取每个月的节假日,计算每个月的工作日时间进度,节假日每年更新

根据需求请假时间要排除法定节假日和非工作时间 1.获取当年的节假日 节假日是每年更新的,没有固定接口,需要手动录入 个人根据官方的节假日整理了当年的所有节假日,可以根据个人需求进行修改 // 获取每个月的节假日,如果当月没…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | LCD Number的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 显示类控件 | LCD Number的使用及说明 文章编号&#xf…

ELK技术介绍:背景、功能及应用场景全面解析

一、ELK概述 ELK是由Elasticsearch、Logstash和Kibana三个开源软件组成的日志管理解决方案,这一组合在近年来得到了广泛的关注和应用。ELK的出现,源于大数据和云计算技术的快速发展,以及对高效日志管理的迫切需求。 随着企业信息化程度…

3dmax云渲染100插件怎么安装?渲染100邀请码1a12

3dmax云渲染插件能在设计师完成参数设置后, 通过点击插件的方式上传到云渲染平台进行渲染,那么3dmax云渲染插件怎么安装呢?以渲染100为例,我们来看下。 下载工具:渲染100客户端 1、设计师在渲染100官网(http://www.x…

淘宝扭蛋机小程序开发:开启购物新纪元,探索乐趣无穷的互动体验

随着科技的飞速发展,人们的购物方式也在不断革新。淘宝扭蛋机小程序应运而生,它巧妙地结合了线上购物与线下娱乐,为消费者带来了一种前所未有的互动体验。今天,就让我们一起走进淘宝扭蛋机小程序的开发世界,探索其背后…

DHCP原理和配置

1、DHCP原理 (1)什么是DHCP DHCP(Dynamic HostConfiguration Protocol,动态主机配置协议):给网络内的客户机自动分配IP地址由internet工作任务小组设计开发口专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议DHCP采用的是UDP作为传输…

【数字图像处理笔记】Matlab实现离散傅立叶变换 (二)

💌 所属专栏:【数字图像处理笔记】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#x…

离线语音模块初步学习——LSYT201B(深圳雷龙发展)

一 、产品简介 首先简单介绍下该离线语音模块,官方给出的介绍是:YT2228 是根据智能语音交互市场需求及思必驰算法的发展方向定义开发的 “芯片算法”人工智能人机语音交互解决方案,具有高性能、低功耗等特点。该芯片通过软硬融合的方法&…

流量代理第一弹:入门使用

定义 “流量代理是一种网络通信技术,它充当网络通信的中间人,将流量从一个地方传递到另一个地方。通常用于实现网络隧道、网络加速、访问控制和隐私保护等功能。“ 上面是来自chatGPT的回答。从这个回答中,我们不难看出,流量代理…

专利视角下的量子竞赛:《2024全球专利格局白皮书》

2024年1月,欧洲量子产业联盟(QuIC)发布了题为《全球量子技术专利格局描述》的综合白皮书。 该文件以透明的视角展示了当今的知识产权格局,包括知识产权持有人的地理分布。该文件由 QuIC 知识产权(IP)与贸易…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图,记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

Linux Docker下载镜像更改默认存储位置/usr/lib/docker

用于解决docker默认存储位置磁盘空间不足,切换存储位置 1、执行下面命令查看 现在docker的存储位置 docker info | grep "Docker Root Dir" 1.2、如果之前已经下载过镜像可以用mv命令把原来的镜像复制到新的地址 mv /var/lib/docker /data/docker 2、…

vue3中的ref、isRef、shallowRef、triggerRef和customRef

1.ref 接受一个参数值并返回一个响应式且可改变的 ref 对象。 ref 对象拥有一个指向内部值的单一属性 .value property &#xff0c;指向内部值。 例&#xff1a;此时&#xff0c;页面上的 str1 也跟着变化 <template><div><button click"handleClick&quo…

RK3588构建ubuntu22.04根文件系统

前言 RK系列的平台提供了buildroot和debian的系统&#xff0c;使用脚本可以直接构建出来&#xff0c;但是没有提供ubuntu的系统&#xff0c;很多厂商只提供一个rootfs.img的固件包&#xff0c;没有将方法开源出来。本文实现了从ubuntu官网开始构建一个ubuntu22.04根文件系统。…

python数字验证码自动识别

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在网络上&#xff0c;许多网站和应用程序使用验证码&#xff08;Completely Automated Publ…

Vue2 —— 学习(十一)

目录 一、路由 vue-router &#xff08;一&#xff09;路由与路由器 &#xff08;二&#xff09;vue-router 理解 &#xff08;三&#xff09;SPA 理解 &#xff08;四&#xff09;路由 理解 &#xff08;五&#xff09;小案例 1.About.vue 2.Home.vue 3.index.js 4…

移动端应用(APP)如何设计测试用例?

为 APP 设计测试用例需要考虑移动设备的特殊性&#xff0c;如不同的操作系统、设备尺寸、硬件特性以及应用程序自身的特定功能。 以下是为APP设计测试用例时要考虑的内容&#xff1a; 1. 理解需求 熟悉APP的功能需求、用户故事和设计文档。 确定APP的目标用户群体、使用场景…

12.Blender 界面介绍(上)及物体基础编辑操作

设置语言 首先在菜单栏打开编辑-Preferences-界面-翻译&#xff0c;可以修改语言 这里使用的是Steam上下载的4.1版本 工具栏 左边的工具栏&#xff0c;按T就会出现&#xff0c;再按T就会隐藏 右边的工具栏是按N&#xff0c;按N显示&#xff0c;再按N隐藏 旋转画面 长按鼠…