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 方法進行選擇(投影)操作。