Spark SQL 编程初级实践

embedded/2025/3/25 4:16:58/

Spark SQL 编程初级实践


文章目录

  • Spark SQL 编程初级实践
    • @[toc]
    • 写在前面
    • 第1题:Spark SQL 基本操作
      • 主程序代码
      • 主程序执行结果
    • 第2题:编程实现将 RDD 转换为 DataFrame
      • 题目
      • 主程序代码
      • 主程序执行结果
    • 第3题:编程实现利用 DataFrame 读写 MySQL 的数据
      • 题目
      • 主程序代码
      • 主程序执行结果

写在前面

  • Linux:CentOS7.5
  • Spark: spark-3.0.0-bin-hadoop3.2
  • IDE:IntelliJ IDEA2020.2.3

第1题: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 的最小值。

主程序代码

scala">import org.apache.spark.sql.{DataFrame, SparkSession}object t1 {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder().appName("t1").master("local[2]").getOrCreate()import spark.implicits._val df: DataFrame = spark.read.json("dataset/ch05/employee.json")
//        df.show()
//        df.distinct().show()
//        df.drop("id").show()
//        df.filter(df("age") > 20).show()
//        df.groupBy("name").count().show()
//        df.sort(df("name").asc).show()
//        val rows = df.take(3)
//        rows.foreach(println)
//        df.select(df("name").as("username")).show()
//        df.agg("age" -> "avg").show()df.agg("age" -> "min").show()}
}

主程序执行结果

下图从上到下、从左到右以此为第一、二、三、…、十道题的执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VW1uZmx3-1681520762432)(assets/01.png)]

本题很简单,就是相关方法的调用。

第2题:编程实现将 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 的所有数据。请写出程序代码。

主程序代码

scala">import org.apache.spark.sql.{DataFrame, SparkSession}object t2 {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder().appName("t1").master("local[2]").getOrCreate()val employeeInfo = spark.sparkContext.textFile("/input/dataset/employee.txt")import spark.implicits._val employeeDF: DataFrame = employeeInfo.map(_.split(",")).map(attributes =>Employee(attributes(0).trim.toInt, attributes(1), attributes(2).trim.toInt)).toDF()employeeDF.createTempView("employee")val employeeRDD: DataFrame = spark.sql("select id, name, age from employee")employeeRDD.map(e => {"id:" + e(0) + ",name:" + e(1) + ",age:" + e(2)}).show(10, false)}
}case class Employee(id: Long, name: String, age: Long) {
}

主程序执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q4fPAxHW-1681520762433)(assets/02.png)]

本题重在map算子的使用并创建视图执行sql查询,注意程序中要使用到import spark.implicits._

第3题:编程实现利用 DataFrame 读写 MySQL 的数据

题目

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUBcfYHy-1681520762434)(assets/03.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tyxIdIiF-1681520762434)(assets/04.png)]

主程序代码

scala">import java.util.Properties
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Row, SparkSession}object t3 {def main(args: Array[String]): Unit = {val spark: SparkSession = SparkSession.builder().appName("t3").master("local[2]").getOrCreate()val employeeRDD: RDD[Array[String]] = spark.sparkContext.parallelize(Array("3 Mary F 26", "4 Tom M 23")).map(_.split(" "))val schema: StructType = StructType(List(StructField("id", IntegerType, true),StructField("name", StringType, true),StructField("gender", StringType, true),StructField("age", IntegerType, true)))val rowRDD: RDD[Row] = employeeRDD.map(p => Row(p(0).toInt, p(1).trim, p(2).trim, p(3).toInt))val df: DataFrame = spark.createDataFrame(rowRDD, schema)val properties = new Properties()properties.put("user", "root");properties.put("password", "123456");properties.put("driver", "com.mysql.jdbc.Driver");// serverTimezone=UTC语句需要跟在数据库连接语句的第一个位置,否则会报错df.write.mode("append").jdbc("jdbc:mysql://localhost:3306/bd01_spark?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false","bd01_spark.employee", properties)val jdbcDF: DataFrame = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/bd01_spark").option("driver", "com.mysql.jdbc.Driver").option("dbtable", "employee").option("user", "root").option("password", "123456").load()jdbcDF.agg("age" -> "max", "age" -> "sum").show(10, false)}
}

本题主要在于MySQL的JDBC连接创建。

主程序执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3Gfvpvm-1681520762435)(assets/05.png)]

全文结束!!!


http://www.ppmy.cn/embedded/174814.html

相关文章

解决Popwindow宽高的问题。

问题 在使用Popwindow进行自定义的过程中&#xff0c;需要设置popwindow的宽高。但是宽高很多时候容易出问题。比如下面的例子。 布局文件如下 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…

批量删除 PPT 文档幻灯片中的备注

在 PPT 的幻灯片页面中&#xff0c;我们经常会插入备注信息。这些备注信息对于我们演示 PPT 文档非常友好&#xff0c;但是在某些场景下&#xff0c;我们不需要再保留这些备注信息&#xff0c;那如何将每张幻灯片中的备注信息都删除呢&#xff1f;今天这批文章就介绍批量删除 P…

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…

从设计到量产:MHO5000如何实现电源EMIEMC测试全流程自动化?

引言&#xff1a;EMI/EMC测试的“工业革命” 在新能源汽车、5G基站、工业设备等领域&#xff0c;电源EMI/EMC&#xff08;电磁兼容性&#xff09;测试是产品合规性与可靠性的核心环节。传统测试依赖人工操作设备、手动配置参数&#xff0c;不仅效率低下&#xff0c;还易受人为…

在R中读入h5ad文件,并转换为seurat对象

太可恶了要么就报错要么就卡住&#xff01;&#xff01;&#xff01;&#xff01;/(ㄒoㄒ)/~~ library(Seurat) library(SeuratDisk) pbmc10kmono paste0(path,/pbmc10k/use_data/rna_mono.h5ad) 1. Round1 # # 方法1&#xff1a;通过h5Seurat中转 # library(SeuratDisk) …

ICLR 2025 机器人智能灵巧操作更进一步DexTrack

现实世界的机器人距离科幻小说里的机器人世界还有多远&#xff1f;通用灵巧操控何时才能实现&#xff1f;朝着这一伟大的目标&#xff0c;研究通用灵巧操控轨迹跟踪的 DexTrack 便应运而生。 论文地址&#xff1a;https://arxiv.org/abs/2502.09614代码地址&#xff1a;https:/…

Python---数据分析(Pandas八:二维数组DataFrame数据操作一: 数据清洗,数据转换)

一、 数据清洗 1.1、 isnull() 用于检测 DataFrame 中的缺失值&#xff0c;它会返回一个相同形状的布尔型 DataFrame&#xff0c;其中每个元素表示原始 DataFrame 中相应位置的元素是否是缺失 值。 import pandas as pd import numpy as np# 创建一个包含缺失值的 DataFrame …

e2studio开发RA4L1(15)----配置RTC时钟及显示时间

e2studio开发RA4L1.15--配置RTC时钟及显示时间 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callbac…