【2018-04-11】【2.1.1 源码解读】spark sql之DataFrameReader,DataSource,Dataset

在前几篇文章中,我们知道构建一个spark应用,必须要关注的几个类:

  • SparkSession程序入口类
  • Builder:SparkSession的一个内部类,用于添加配置,创建SparkSession对象
  • DataFrameReader:各数据源读入器,csv,json,jdbc,parquet,orc,text,table
  • DataFrameWriter:数据输出器:jdbc,json,parquet,text,table,orc,csv,

DataFrameReader属性

【DataFrameReader属性】在继续阅读DataFrameReader类的时候,发现它有三个核心的属性:

    //createWithDefault("parquet")
  private var source: String = sparkSession.sessionState.conf.defaultDataSourceName

  private var userSpecifiedSchema: Option[StructType] = None

  private var extraOptions = new scala.collection.mutable.HashMap[String, String]
  • source:表示数据的类型,默认是parquet格式,可以使用 format(source: String)方法进行配置
  • userSpecifiedSchema用于定义数据元格式,可以通过schema(schema: StructType)进行配置,如果配置了schema文件,那么会更快的下载数据:Specifies the input schema. Some data sources (e.g. JSON) can infer the input schema automatically from dataBy specifying the schema here, the underlying data source can skip the schema inference step, and thus speed up data loading.
  • extraOptions用于配置额外的一些属性,比如:
    timeZone (default session local timezone): sets the string that indicates a timezone to be used to parse timestamps in the JSON/CSV datasources or partition values.

DataFrameReader方法

DataFrameReader主要用于读取外部数据,其中核心方法是load的方法,load方法如下:

  def load(): DataFrame = {
    if (source.toLowerCase(Locale.ROOT) == DDLUtils.HIVE_PROVIDER) {
      throw new AnalysisException("Hive data source can only be used with tables, you can not " +
        "read files of Hive data source directly.")
    }

    val dataSource =
      DataSource(
        sparkSession,
       userSpecifiedSchema = userSpecifiedSchema,
        className = source,
        options = extraOptions.toMap)
    Dataset.ofRows(sparkSession, StreamingRelation(dataSource))
}


  def load(path: String): DataFrame = {
    option("path", path).load()
  }

注意:如果数据源是hive,那么不能使用load方法而是该从table中获取;

读hive数据样例:

 val warehouseLocation = new File("spark-warehouse").getAbsolutePath

val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .config("spark.sql.warehouse.dir", warehouseLocation)
  .enableHiveSupport()
  .getOrCreate()

import spark.implicits._
import spark.sql

val sqlDF = sql("SELECT key, value FROM src WHERE key < 10 ORDER BY key")

option方法:

  def option(key: String, value: String): DataStreamReader = {
    this.extraOptions += (key -> value)
    this
  }

由load源代码可知,其调用了两个重要的类:DataSourceDataset


DataSource

在上面load方法中,有这样一个调用:

 val dataSource =
          DataSource(
            sparkSession,
           userSpecifiedSchema = userSpecifiedSchema,
            className = source,
            options = extraOptions.toMap)

 Dataset.ofRows(sparkSession, StreamingRelation(dataSource))

可以知道,在使用DataFrameReader封装了各种属性之后,最终是将各种值传入构建DataSource,所以了解DataSource的构成是很有必要的。

DataSource既有class又有其伴生对象,源码中包含注释共600多行,值得花时间去研读。

未完待续

Dataset

未完待续

你可能感兴趣的:(【2018-04-11】【2.1.1 源码解读】spark sql之DataFrameReader,DataSource,Dataset)