1006DataFrameReader 詳解

DataFrameReader 用於通過外部數據源的格式(如 text、CVS 等)和數據結構加載 Dataset,DataFrameReader 還提供了非常豐富的操作 DataFrame 的 API。有了DataFrame-Reader,我們就可以將各種格式的數據源轉換爲 Dataset 或DataFrame,進而以面向關係型數據的方式操縱各種格式的數據。

DataFrameReader屬性

 

  • source:輸入數據源的格式。可通過 spark.sql.sources.default 屬性配置,默認爲 parquet。

小貼士:Apache Parquet 是 Hadoop 生態圈中一種新型列式存儲格式,它可以兼容 Hadoop 生態圈中大多數計算框架(Hadoop、Spark 等),被多種查詢引擎支持(Hive、Impala、Drill 等),並且是數據處理框架、數據模型和語言無關的。Parquet 最初是由 Twitter 和 Cloudera(由於 Impala 的緣故)合作開發完成並開源,2015 年 5 月從 Apache 的孵化器裏畢業成爲 Apache 頂級項目。

  • userSpecifiedSchema:用戶指定的 Schema,實際的類型是 StructType。
  • extraOptions:類型爲 HashMap[String,String],用於保存額外的選項。

 

DataFrameReader方法

format

 

用於設置輸入數據源的格式

 

def format(source: String): DataFrameReader = {
  this.source = source
  this
}

schema

用於設置用戶指定的結構類型StructType

 

def schema(schema: StructType): DataFrameReader = {
  this.userSpecifiedSchema = Option(schema)
  this
}

 

多種多樣的 option

 

DataFrameReader 提供了多個重載的 option 方法用於向 extraOptions 中添加選項無論哪個 option 方法都將轉換爲對最基本的 option 方法的調用

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

DataFrameReader 還提供了很多將其他基本類型轉換爲字符串後添加到 options 中的方法,例如,將長整型轉換爲字符串後放入 extraOptions 的 option 方法。

def option(key: String, value: Long): DataFrameReader = option(key, value.toString)

DataFrameReader 還提供了將 scala.collection.Map 或 java.util.Map 中的 key 和 value 作爲選項添加到 options 中的方法,例如,將 scala.collection.Map 中的鍵值對放入 extraOptions 的 option 方法。

def options(options: scala.collection.Map[String, String]): DataFrameReader = {
  this.extraOptions ++= options
  this
}

多種多樣的 load

DataFrameReader 提供了多個重載的 load 方法,用於將數據源的數據加載到DataFrame。這些 load 方法實際都會轉換爲調用代碼清單所示的 load 方法來加載數據。

@scala.annotation.varargs
def load(paths: String*): DataFrame = {
  sparkSession.baseRelationToDataFrame(
    DataSource.apply(
      sparkSession,
      paths = paths,
      userSpecifiedSchema = userSpecifiedSchema,
      className = source,
      options = extraOptions.toMap).resolveRelation())
}

DataFrameReader 的 load 方法首先構造 DataSource 實例然後調用 DataSource resolveRelation 方法解析得到BaseRelation最後調用 SparkSession baseRelationToDataFrame 方法 BaseRelation 轉換爲 DataFrame

 

重載的 text

 

DataFrameReader 提供了兩個重載的 text 方法,用於設置輸入數據源的格式爲 text 並加載數據,如代碼所示。

def text(path: String): DataFrame = {
  text(Seq(path): _*)
}

@scala.annotation.varargs
def text(paths: String*): DataFrame = format("text").load(paths : _*)

除了 text 方法外DataFrameReader 還提供了多個重載的 jdbc 方法json 方法csv 方法parquet 方法及 orc 方法這些方法的實現都與 text 類似即最終落實到對 format 方法和 load 方法的調用並轉換爲 DataFrame

 

重載的 textFile

DataFrameReader 提供了兩個重載的 textFile 方法,用於設置輸入數據源的格式並加載數據,如代碼所示。

def textFile(path: String): Dataset[String] = {
  textFile(Seq(path): _*)
}

@scala.annotation.varargs
def textFile(paths: String*): Dataset[String] = {
  if (userSpecifiedSchema.nonEmpty) {
    throw new AnalysisException("User specified schema not supported with `textFile`")
  }
  text(paths : _*).select("value").as[String](sparkSession.implicits.newString-Encoder)
}


可以看到textFile 方法首先調用 text 方法將文本文件轉換爲 DataFrame然後調用 DataFrame 的 select 方法進行選擇投影操作

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章