Spark(三)-- SparkSQL扩展(数据读写) --DataFrameReader和DataFrameWriter(一)

7.1 初识 DataFrameReader

目标

理解 DataFrameReader 的整体结构和组成

SparkSQL 的一个非常重要的目标就是完善数据读取, 所以 SparkSQL 中增加了一个新的框架, 专门用于读取外部数据源, 叫做 DataFrameReader

  @Test
  def reader1() : Unit = {
    //1.创建SparkSession
    val spark = SparkSession.builder()
      .master("local[6]")
      .appName("reader1")
      .getOrCreate()

    //2.框架在哪
    val reader: DataFrameReader = spark.read
  }

DataFrameReader 由如下几个组件组成(1.文件地址2.文件类型3.读取时候的参数4.结构信息)

组件解释

schema

结构信息, 因为 Dataset 是有结构的, 所以在读取数据的时候, 就需要有 Schema 信息, 有可能是从外部数据源获取的, 也有可能是指定的

option

连接外部数据源的参数, 例如 JDBC 的 URL, 或者读取 CSV 文件是否引入 Header 等

format

外部数据源的格式, 例如 csvjdbcjson 等

DataFrameReader 有两种访问方式, 一种是使用 load 方法加载, 使用 format 指定加载格式, 还有一种是使用封装方法, 类似 csvjsonjdbc 等

  @Test
  def reader2() : Unit = {
    //1.创建SparkSession
    val spark = SparkSession.builder()
      .master("local[6]")
      .appName("reader1")
      .getOrCreate()

    //2.第一种形式  load + format读取
    spark.read
      .format("csv")
      .option("header",value=true)
      .option("inferSchema",value = true)
      .load("dataset/BeijingPM20100101_20151231.csv")
      .show(10)

    //3.第二种形式 使用具体文件类型读取
    spark.read
      .option("header",value=true)
      .option("inferSchema",value = true)
      .csv("dataset/BeijingPM20100101_20151231.csv")
      .show(10)

  }

但是其实这两种方式本质上一样, 因为类似 csv 这样的方式只是 load 的封装

e8af7d7e5ec256de27b2e40c8449a906

如果使用 load 方法加载数据, 但是没有指定 format 的话, 默认是按照 Parquet 文件格式读取。也就是说, SparkSQL 默认的读取格式是 Parquet

总结

  1. 使用 spark.read 可以获取 SparkSQL 中的外部数据源访问框架 DataFrameReader

  2. DataFrameReader 有三个组件 formatschemaoption

  3. DataFrameReader 有两种使用方式, 一种是使用 load 加 format 指定格式, 还有一种是使用封装方法 csvjson

7.2 初识 DataFrameWriter

目标

理解 DataFrameWriter 的结构

对于 ETL 来说, 数据保存和数据读取一样重要, 所以 SparkSQL 中增加了一个新的数据写入框架, 叫做 DataFrameWriter

  @Test
  def write1() : Unit = {
    //1.创建SparkSession
    val spark = SparkSession.builder()
      .master("local[6]")
      .appName("reader1")
      .getOrCreate()

    //2.读取数据集
    val df = spark.read.option("header",value = true).csv("dataset/BeijingPM20100101_20151231.csv")

    //3.写入数据集
    df.write.json("dataset/beijing_pm.json")

    df.write.format("json").save("dataset/beijing_pm2.json")

    spark.stop()

  }

DataFrameWriter 中由如下几个部分组成

组件解释

source

写入目标, 文件格式等, 通过 format 方法设定

mode

写入模式, 例如一张表已经存在, 如果通过 DataFrameWriter 向这张表中写入数据, 是覆盖表呢, 还是向表中追加呢? 通过 mode方法设定

extraOptions

外部参数, 例如 JDBC 的 URL, 通过 optionsoption 设定

partitioningColumns

类似 Hive 的分区, 保存表的时候使用, 这个地方的分区不是 RDD的分区, 而是文件的分区, 或者表的分区, 通过 partitionBy 设定

bucketColumnNames

类似 Hive 的分桶, 保存表的时候使用, 通过 bucketBy 设定

sortColumnNames

用于排序的列, 通过 sortBy 设定

mode 指定了写入模式, 例如覆盖原数据集, 或者向原数据集合中尾部添加等

Scala 对象表示字符串表示解释

SaveMode.ErrorIfExists

"error"

将 DataFrame 保存到 source 时, 如果目标已经存在, 则报错

SaveMode.Append

"append"

将 DataFrame 保存到 source 时, 如果目标已经存在, 则添加到文件或者 Table

SaveMode.Overwrite

"overwrite"

将 DataFrame 保存到 source 时, 如果目标已经存在, 则使用 DataFrame 中的数据完全覆盖目标

SaveMode.Ignore

"ignore"

将 DataFrame 保存到 source 时, 如果目标已经存在, 则不会保存 DataFrame 数据, 并且也不修改目标数据集, 类似于 CREATE TABLE IF NOT EXISTS

DataFrameWriter 也有两种使用方式, 一种是使用 format 配合 save, 还有一种是使用封装方法, 例如 csvjsonsaveAsTable 等

  val spark = SparkSession.builder()
    .master("local[6]")
    .appName("reader1")
    .getOrCreate()

  @Test
  def parquet(): Unit={
    //1.读取csv文件的数据
    val df = spark.read.option("header",value = true).csv("dataset/BeijingPM20100101_20151231.csv")

    //2.把数据写为Parquet格式
    // 写入时:spark默认的文件格式parquet
    // 写入模式:报错,覆盖,追加,忽略
    df.write
      .format("parquet")
      .mode(SaveMode.Overwrite)
      .save("dataset/beijing_pm3")

    //3.读取Parquet格式文件
    // 默认格式是parquet
    // 可以读取文件夹
    spark.read
      .load("dataset/beijing_pm3")
      .show()

  }

默认没有指定 format, 默认的 format 是 Parquet

总结

  1. 类似 DataFrameReaderWriter 中也有 formatoptions, 另外 schema 是包含在 DataFrame 中的

  2. DataFrameWriter 中还有一个很重要的概念叫做 mode, 指定写入模式, 如果目标集合已经存在时的行为

  3. DataFrameWriter 可以将数据保存到 Hive 表中, 所以也可以指定分区和分桶信息

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值