当前位置: 首页 > news >正文

【Spark征服之路-3.7-Spark-SQL核心编程(六)】

数据加载与保存:

通用方式:

SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet

加载数据:

spark.read.load 是加载数据的通用方法。如果读取不同格式的数据,可以对不同的数据格式进行设定。

spark.read.format("…")[.option("…")].load("…")

➢ format("…"):指定加载的数据类型,包括"csv"、"jdbc"、"json"、"orc"、"parquet"和

"textFile"。

➢ load("…"):在"csv"、"jdbc"、"json"、"orc"、"parquet"和"textFile"格式下需要传入加载

数据的路径。

➢ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable

我们前面都是使用 read API 先把文件加载到 DataFrame 然后再查询,其实,我们也可以直接在文件上进行查询: 文件格式.`文件路径`

spark.sql("select * from json.’ Spark-SQL/input/user.json’").show

保存数据:

df.write.save 是保存数据的通用方法。如果保存不同格式的数据,可以对不同的数据格式进行设定。

df.write.format("…")[.option("…")].save("…")

➢ format("…"):指定保存的数据类型,包括"csv"、"jdbc"、"json"、"orc"、"parquet"和

"textFile"。

➢ save ("…"):在"csv"、"orc"、"parquet"和"textFile"格式下需要传入保存数据的路径。

➢ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable

保存操作可以使用 SaveMode, 用来指明如何处理数据,使用 mode()方法来设置。

例如:df.write.mode("append").json("Spark-SQL/output")

Parquet

Spark SQL 的默认数据源为 Parquet 格式。Parquet 是一种能够有效存储嵌套数据的列式

存储格式。数据源为 Parquet 文件时,Spark SQL 可以方便的执行所有的操作,不需要使用 format。修改配置项 spark.sql.sources.default,可修改默认数据源格式。

加载数据:

val df = spark.read.load("examples/src/main/resources/users.parquet")

保存数据:

var df = spark.read.json("/opt/module/data/input/people.json")

df.write.mode("append").save("/opt/module/data/output")

JSON

Spark SQL 能够自动推测 JSON 数据集的结构,并将它加载为一个 Dataset[Row]. 可以

通过 SparkSession.read.json()去加载 JSON 文件。注意:Spark 读取的 JSON 文件不是传统的 JSON 文件,每一行都应该是一个 JSON 串

加载json文件

val path = "/opt/module/spark-local/people.json"

val peopleDF = spark.read.json(path)

创建临时表

peopleDF.createOrReplaceTempView("people")

数据查询

val resDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")

CSV

Spark SQL 可以配置 CSV 文件的列表信息,读取 CSV 文件,CSV 文件的第一行设置为

数据列。

spark.read.format("csv").option("sep",";").option("inferSchema","true")

.option("header", "true").load("data/user.csv")

MySQL

Spark SQL 可以通过 JDBC 从关系型数据库中读取数据的方式创建 DataFrame,通过对

DataFrame 一系列的计算后,还可以将数据再写回关系型数据库中。

IDEA通过JDBC对MySQL进行操作:

1. 导入依赖

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>

MySQL8  <version>8.0.11</version>

2. 读取数据

val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
val spark:SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()

import spark.implicits._

//通用的load方式读取


spark.read.format("jdbc")
  .option("url","jdbc:mysql://localhost:3306/system")
  .option("driver","com.mysql.jdbc.Driver")//com.mysql.cj.jdbc.Driver
  .option("user","root")
  .option("password","123456")
  .option("dbtable","user")
  .load().show()

spark.stop()

//通用的load方法的另一种形式
spark.read.format("jdbc")
  .options(
Map("url"->"jdbc:mysql://localhost:3306/system?user=root&password=123456","dbtable"->"user","driver"->"com.mysql.jdbc.Driver"))
  .load().show()

//通过JDBC
val pros :Properties = new Properties()
pros.setProperty("user","root")
pros.setProperty("password","123456")
val df :DataFrame = spark.read.jdbc("jdbc:mysql://localhost:3306/system","user",pros)
df.show()

3. 写入数据

val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
val spark:SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()

import spark.implicits._
val rdd: RDD[Stu] = spark.sparkContext.makeRDD(List(Stu("lisi", 20),
Stu("zs", 30)))
val ds:Dataset[Stu] = rdd.toDS()

ds.write.format("jdbc")
  .option("url","jdbc:mysql://localhost:3306/system")
  .option("driver","com.mysql.jdbc.Driver")
  .option("user","root")
  .option("password","123456")
  .option("dbtable","user2")
  .mode(SaveMode.Append)
  .save()

spark.stop()

http://www.lryc.cn/news/596358.html

相关文章:

  • Aspose.Cells 应用案例:法国能源企业实现能源数据报告Excel自动化
  • 中国科技信息杂志中国科技信息杂志社中国科技信息编辑部2025年第14期目录
  • stm32 智能小车
  • vue2使用v-viewer实现自动预览
  • S2B2C电子商务模式介绍
  • 【Pytest】从配置到固件的使用指南
  • Vue底层换成啥了?如何更新DOM的?
  • YOLO-实例分割头
  • 大数据量查询计算引发数据库CPU告警问题复盘
  • 静态登录界面
  • vscode,cursor,Trae终端不能使用cnpm、npm、pnpm命令解决方案
  • 类加载过程及双亲委派模型
  • git push新版问题解决
  • 以 Everoute 替代 VMware NSX:关键能力可对标,使用和运维更简单
  • 单片机的几种GPIO输入输出模型详解
  • Linux CentOS 虚拟机升级内核至4.x以上版本
  • 对随机生成的html文件做标签简析
  • CentOS 7 安装nginx
  • Docker/DockerHub 镜像源可用列表
  • AWS: 云上侦探手册,七步排查ALB与EC2连接疑云
  • Apache Ignite 索引(Indexes)定义和使用
  • 实操:AWS CloudFront的动态图像转换
  • 服务器租用:网络钓鱼具体是指什么?
  • 扇形区域拉普拉斯方程傅里叶解法2
  • Windows Cmake Vs2017/2010 编译安装Protobuf
  • 算法训练营day28 贪心算法②122.买卖股票的最佳时机II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和
  • Flutter基础(前端教程①⑦-Column竖直-Row水平-Warp包裹-Stack堆叠)
  • Flutter基础(前端教程①⑨-margin-padding)
  • 全星FMEA软件系统:FMEA、PC、PFD一体化管理的智能解决方案
  • Scrapyd与ScrapydAPI深度解析:企业级爬虫部署与管理解决方案