【2018-04-11】【2.1.1 源码解读】spark sq

2018-04-11  本文已影响636人  jackLee

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


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]

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

未完待续

上一篇 下一篇

猜你喜欢

热点阅读