SparkSQL数据源代码分析

本文详细介绍了如何使用SparkSQL加载和保存数据源,包括Parquet、JSON文件以及JDBC读取数据。通过实例展示了从文件系统加载JSON数据,以Append和Overwrite模式保存数据,以及如何对Parquet文件进行分区。同时,还演示了如何从远程数据库通过JDBC读取数据并展示结果。
摘要由CSDN通过智能技术生成

Spark SQL支持通过DataFrame接口对各种数据源进行操作。DataFrame 可以使用关系转换进行操作,也可以用于创建临时视图。将DataFrame注册为临时视图允许您对其数据运行SQL查询。

本实训介绍使用Spark数据源加载和保存数据的一般方法,然后介绍可用于内置数据源的特定选项。

第1关:SparkSQL加载和保存:

DataFrameReader用于从外部存储系统(例如文件系统,键值存储等)加载数据集的接口。使用SparkSession.read来访问它。

DataFrameReader提供了(jsonparquetjdbcorclibsvmcsvtext)格式支持,DataFrameReader.load(String... paths)方法支持多个路径的数据源,默认使用parquet格式(除非另有配置,spark.sql.sources.default)用于所有操作

 
  1. Dataset<Row> usersDF = spark.read().load("examples/src/main/resources/users.parquet");

您还可以手动指定将要使用的数据源以及要传递给数据源的任何其他选项。数据源通过其全名指定(即org.apache.spark.sql.parquet),但内置的来源,你也可以使用自己的短名称(jsonparquetjdbcorclibsvmcsvtext)。从任何数据源类型加载的 Dataset 都可以使用此语法转换为其他类型。

要加载JSON文件,您可以使用:

 
  1. //加载
  2. Dataset<Row> peopleDF =
  3. spark.read().format("json").load("examples/src/main/resources/people.json");

要加载CSV文件,您可以使用:

 
  1. Dataset<Row> peopleDFCsv = spark.read().format("csv")
  2. .option("sep", ";")
  3. .option("inferSchema", "true")
  4. .option("header", "true")
  5. .load("examples/src/main/resources/people.csv");

直接在文件上运行SQL

您可以直接使用SQL查询该文件,而不是使用读取API将文件加载到 Dataset并进行查询。

 
  1. Dataset<Row> sqlDF =
  2. spark.sql("SELECT * FROM parquet.`src/main/resources/users.parquet`");

保存到路径

DataFrameWriter用于将数据集写入外部存储系统的接口(例如文件系统,键值存储等), 使用Dataset.write访问它。

使用DataFrameWriter.save(String path),就可以将Dataset的内容保存在指定的路径中。

 
  1. //写入并保存到指定路径
  2. peopleDF.select("name","age").write().format("parquet").save("F:\\test\\anamesAndAges");

保存模式介绍

save()方法支持设置保存模式,使用DataFrameWriter.mode(SaveMode saveMode)可用于指定将Dataset保存到数据源的预期行为,指定如何处理现有数据(例如,执行时设置类型为Overwrite,则数据将在写出新数据之前被删除。)但需要注意的这些保存模式不使用任何锁定并且不是原子的。

SaveMode 类型如下:

Scala/Java 含义
SaveMode.ErrorIfExists (默认) Dataset保存到数据源时,如果数据已存在,则会引发异常。
SaveMode.Append Dataset保存到数据源时,如果数据/表已存在,则Dataset的内容应附加到现有数据。
SaveMode.Overwrite 覆盖模式意味着在将Dataset保存到数据源时,如果数据/表已经存在,则预期现有数据将被Dataset的内容覆盖。
SaveMode.Ignore 忽略模式意味着在将Dataset保存到数据源时,如果数据已存在,则预期保存操作不会保存Dataset的内容而不会更改现有数据。这与CREATE TABLE IF NOT EXISTSSQL中的类似。
 
  1. //覆盖原有数据并写入到F:\\test\\anamesAndAges路径上
  2. peopleDF.select("name","age").write().mode("overwrite").save("F:\\test\\anamesAndAges")

保存到持久表

Dataset也可以使用saveAsTable 命令将持久表保存到Hive Metastore中。请注意,使用此功能不需要现有的Hive部署。Spark将为您创建默认的本地Hive Metastore(使用Derby)。

createOrReplaceTempView命令不同,saveAsTable将实现DataSet的内容并创建指向Hive Metastore中数据的指针。只要您保持与同一 Metastore的连接,即使您的Spark程序重新启动后,持久表仍然存在。可以通过spark.sql()方法通过表的名称调用来创建持久表的Dataset

对于基于文件的数据源,例如textparquetjson等,您可以通过path选项指定自定义表路径 ,例如:

 
  1. df.write.option("path", "/some/path").saveAsTable("t")

删除表时,将不会删除自定义表路径,并且表数据仍然存在。如果未指定自定义表路径,则Spark会将数据写入仓库目录下的默认表路径。删除表时,也将删除默认表路径。

Spark 2.1开始,持久数据源表将每个分区元数据存储在Hive Metastore中。这带来了几个好处:

由于Metastore只能返回查询所需

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cz学java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值