数据读写
初识 DataFrameReader
SparkSQL
的一个非常重要的目标就是完善数据读取, 所以 SparkSQL
中增加了一个新的框架, 专门用于读取外部数据源, 叫做 DataFrameReader
def reader1(): Unit = {
// 1. 创建 SparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("reader1")
.getOrCreate()
// 2. 框架在哪
val reader: DataFrameReader = spark.read
}
DataFrameReader
由如下几个组件组成
DataFrameReader 两种访问方式
一种是使用 load
方法加载, 使用 format
指定加载格式
一种是使用封装方法, 类似 csv
, json
, jdbc
等.
def reader2(): Unit = {
// 创建 SparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("reader2")
.getOrCreate()
// 第一种形式 load
spark.read
.format("csv")
.option("header", value = true)
.option("inferSchema", value = true)
.load("dataset/BeijingPM20100101_20151231.csv")
.show(10)
// 第二种形式 csv 等封装方法
spark.read
.option("header", value = true)
.option("inferSchema", value = true)
.csv("dataset/BeijingPM20100101_20151231.csv")
.show(10)
}
但是其实这两种方式本质上一样, 因为类似 csv
这样的方式只是 load
的封装
如果使用 load
方法加载数据, 但是没有指定 format
的话, 默认是按照 Parquet
文件格式读取
也就是说, SparkSQL
默认的读取格式是 Parquet
初识 DataFrameWriter
对于 ETL
来说, 数据保存和数据读取一样重要, 所以 SparkSQL
中增加了一个新的数据写入框架, 叫做 DataFrameWriter
val spark: SparkSession = ...
val df = spark.read
.option("header", true)
.csv("dataset/BeijingPM20100101_20151231.csv")
val writer: DataFrameWriter[Row] = df.write
DataFrameWriter
中由如下几个部分组成
mode
指定了写入模式, 例如覆盖原数据集, 或者向原数据集合中尾部添加等
DataFrameWriter
也有两种使用方式, 一种是使用 format
配合 save
, 还有一种是使用封装方法, 例如 csv
, json
, saveAsTable
等
def writer1(): Unit = {
val df = spark.read.option("header", true).csv("dataset/BeijingPM20100101_20151231.csv")
// 使用 json 保存,因为方法是 json,所以隐含的 format 是 json
df.write.json("dataset/beijing_pm.json")
// 使用 save 保存,使用 format 设置文件格式
df.write.format("json").save("dataset/beijing_pm2.json")
}
读写 Parquet 格式文件
什么时候会用到 Parquet ?
在 ETL 中, Spark 经常扮演 T 的职务, 也就是进行数据清洗和数据转换.
为了能够保存比较复杂的数据, 并且保证性能和压缩率, 通常使用 Parquet 是一个比较不错的选择.
所以外部系统收集过来的数据, 有可能会使用 Parquet, 而 Spark 进行读取和转换的时候, 就需要支持对 Parquet 格式的文件的支持.
使用代码读写 Parquet文件
默认不指定 format
的时候, 默认就是读写 Parquet
格式的文件
def parquet(): Unit = {
// 1. 读取 CSV 文件的数据
val df = spark.read
.option("header", true)
.csv("dataset/BeijingPM20100101_20151231.csv")
// 2. 把数据写为 Parquet 格式
// 写入的时候, 默认格式就是 parquet
// 写入模式, 报错, 覆盖, 追加, 忽略
df.write
.mode(SaveMode.Overwrite)
.save("dataset/beijing_pm3")
// 3. 读取 Parquet 格式文件
// 默认格式是否是 paruet? 是
// 是否可能读取文件夹呢? 是
spark.read
.load("dataset/beijing_pm3")
.show()
}
写入 Parquet 的时候可以指定分区
Spark
在写入文件的时候是支持分区的, 可以像 Hive
一样设置某个列为分区列
def parquetPartitions(): Unit = {
// 1. 读取数据
val df = spark.read
.option("header", value =