日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

Spark SQL數(shù)據(jù)加載和保存實例講解

2024-08-31 01:04:17
字體:
供稿:網(wǎng)友

一、前置知識詳解
Spark SQL重要是操作DataFrame,DataFrame本身提供了save和load的操作,
Load:可以創(chuàng)建DataFrame,
Save:把DataFrame中的數(shù)據(jù)保存到文件或者說與具體的格式來指明我們要讀取的文件的類型以及與具體的格式來指出我們要輸出的文件是什么類型。

二、Spark SQL讀寫數(shù)據(jù)代碼實戰(zhàn)

import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.api.java.function.Function;import org.apache.spark.sql.*;import org.apache.spark.sql.types.DataTypes;import org.apache.spark.sql.types.StructField;import org.apache.spark.sql.types.StructType;import java.util.ArrayList;import java.util.List;public class SparkSQLLoadSaveOps { public static void main(String[] args) {  SparkConf conf = new SparkConf().setMaster("local").setAppName("SparkSQLLoadSaveOps");  JavaSparkContext sc = new JavaSparkContext(conf);  SQLContext = new SQLContext(sc);  /**   * read()是DataFrameReader類型,load可以將數(shù)據(jù)讀取出來   */  DataFrame peopleDF = sqlContext.read().format("json").load("E://Spark//Sparkinstanll_package//Big_Data_Software//spark-1.6.0-bin-hadoop2.6//examples//src//main//resources//people.json");  /**   * 直接對DataFrame進行操作   * Json: 是一種自解釋的格式,讀取Json的時候怎么判斷其是什么格式?   * 通過掃描整個Json。掃描之后才會知道元數(shù)據(jù)   */  //通過mode來指定輸出文件的是append。創(chuàng)建新文件來追加文件 peopleDF.select("name").write().mode(SaveMode.Append).save("E://personNames"); }}

讀取過程源碼分析如下:
1. read方法返回DataFrameReader,用于讀取數(shù)據(jù)。

/** * :: Experimental :: * Returns a [[DataFrameReader]] that can be used to read data in as a [[DataFrame]]. * {{{ *  sqlContext.read.parquet("/path/to/file.parquet") *  sqlContext.read.schema(schema).json("/path/to/file.json") * }}} * * @group genericdata * @since 1.4.0 */@Experimental//創(chuàng)建DataFrameReader實例,獲得了DataFrameReader引用def read: DataFrameReader = new DataFrameReader(this)

2.  然后再調(diào)用DataFrameReader類中的format,指出讀取文件的格式。

/** * Specifies the input data source format. * * @since 1.4.0 */def format(source: String): DataFrameReader = { this.source = source this}

3.  通過DtaFrameReader中l(wèi)oad方法通過路徑把傳入過來的輸入變成DataFrame。

/** * Loads input in as a [[DataFrame]], for data sources that require a path (e.g. data backed by * a local or distributed file system). * * @since 1.4.0 */// TODO: Remove this one in Spark 2.0.def load(path: String): DataFrame = { option("path", path).load()}

至此,數(shù)據(jù)的讀取工作就完成了,下面就對DataFrame進行操作。
下面就是寫操作!??!

1. 調(diào)用DataFrame中select函數(shù)進行對列篩選

/** * Selects a set of columns. This is a variant of `select` that can only select * existing columns using column names (i.e. cannot construct expressions). * * {{{ *  // The following two are equivalent: *  df.select("colA", "colB") *  df.select($"colA", $"colB") * }}} * @group dfops * @since 1.3.0 */@scala.annotation.varargsdef select(col: String, cols: String*): DataFrame = select((col +: cols).map(Column(_)) : _*)

2.  然后通過write將結(jié)果寫入到外部存儲系統(tǒng)中。

/** * :: Experimental :: * Interface for saving the content of the [[DataFrame]] out into external storage. * * @group output * @since 1.4.0 */@Experimentaldef write: DataFrameWriter = new DataFrameWriter(this)

3.   在保持文件的時候mode指定追加文件的方式

/** * Specifies the behavior when data or table already exists. Options include:// Overwrite是覆蓋 *  - `SaveMode.Overwrite`: overwrite the existing data.//創(chuàng)建新的文件,然后追加 *  - `SaveMode.Append`: append the data. *  - `SaveMode.Ignore`: ignore the operation (i.e. no-op). *  - `SaveMode.ErrorIfExists`: default option, throw an exception at runtime. * * @since 1.4.0 */def mode(saveMode: SaveMode): DataFrameWriter = { this.mode = saveMode this}

4.   最后,save()方法觸發(fā)action,將文件輸出到指定文件中。

/** * Saves the content of the [[DataFrame]] at the specified path. * * @since 1.4.0 */def save(path: String): Unit = { this.extraOptions += ("path" -> path) save()}

三、Spark SQL讀寫整個流程圖如下

Spark,SQL數(shù)據(jù)加載和保存,SQL數(shù)據(jù)保存,SQL讀寫數(shù)據(jù)

四、對于流程中部分函數(shù)源碼詳解

DataFrameReader.Load()

1. Load()返回DataFrame類型的數(shù)據(jù)集合,使用的數(shù)據(jù)是從默認的路徑讀取。

/** * Returns the dataset stored at path as a DataFrame, * using the default data source configured by spark.sql.sources.default. * * @group genericdata * @deprecated As of 1.4.0, replaced by `read().load(path)`. This will be removed in Spark 2.0. */@deprecated("Use read.load(path). This will be removed in Spark 2.0.", "1.4.0")def load(path: String): DataFrame = {//此時的read就是DataFrameReader read.load(path)}

2.  追蹤load源碼進去,源碼如下:
在DataFrameReader中的方法。Load()通過路徑把輸入傳進來變成一個DataFrame。

/**  * Loads input in as a [[DataFrame]], for data sources that require a path (e.g. data backed by * a local or distributed file system). * * @since 1.4.0 */// TODO: Remove this one in Spark 2.0.def load(path: String): DataFrame = { option("path", path).load()}

3.  追蹤load源碼如下:

/** * Loads input in as a [[DataFrame]], for data sources that don't require a path (e.g. external * key-value stores). * * @since 1.4.0 */def load(): DataFrame = {//對傳入的Source進行解析 val resolved = ResolvedDataSource(  sqlContext,  userSpecifiedSchema = userSpecifiedSchema,  partitionColumns = Array.empty[String],  provider = source,  options = extraOptions.toMap) DataFrame(sqlContext, LogicalRelation(resolved.relation))}

DataFrameReader.format()

1. Format:具體指定文件格式,這就獲得一個巨大的啟示是:如果是Json文件格式可以保持為Parquet等此類操作。
Spark SQL在讀取文件的時候可以指定讀取文件的類型。例如,Json,Parquet.

/** * Specifies the input data source format.Built-in options include “parquet”,”json”,etc. * * @since 1.4.0 */def format(source: String): DataFrameReader = { this.source = source //FileType this}

DataFrame.write()

1. 創(chuàng)建DataFrameWriter實例

/** * :: Experimental :: * Interface for saving the content of the [[DataFrame]] out into external storage. * * @group output * @since 1.4.0 */@Experimentaldef write: DataFrameWriter = new DataFrameWriter(this)1

2.  追蹤DataFrameWriter源碼如下:
以DataFrame的方式向外部存儲系統(tǒng)中寫入數(shù)據(jù)。

/** * :: Experimental :: * Interface used to write a [[DataFrame]] to external storage systems (e.g. file systems, * key-value stores, etc). Use [[DataFrame.write]] to access this. * * @since 1.4.0 */@Experimentalfinal class DataFrameWriter private[sql](df: DataFrame) {

DataFrameWriter.mode()

1. Overwrite是覆蓋,之前寫的數(shù)據(jù)全都被覆蓋了。
Append:是追加,對于普通文件是在一個文件中進行追加,但是對于parquet格式的文件則創(chuàng)建新的文件進行追加。

/** * Specifies the behavior when data or table already exists. Options include: *  - `SaveMode.Overwrite`: overwrite the existing data. *  - `SaveMode.Append`: append the data. *  - `SaveMode.Ignore`: ignore the operation (i.e. no-op).//默認操作 *  - `SaveMode.ErrorIfExists`: default option, throw an exception at runtime. * * @since 1.4.0 */def mode(saveMode: SaveMode): DataFrameWriter = { this.mode = saveMode this}

2.  通過模式匹配接收外部參數(shù)

/** * Specifies the behavior when data or table already exists. Options include: *  - `overwrite`: overwrite the existing data. *  - `append`: append the data. *  - `ignore`: ignore the operation (i.e. no-op). *  - `error`: default option, throw an exception at runtime. * * @since 1.4.0 */def mode(saveMode: String): DataFrameWriter = { this.mode = saveMode.toLowerCase match {  case "overwrite" => SaveMode.Overwrite  case "append" => SaveMode.Append  case "ignore" => SaveMode.Ignore  case "error" | "default" => SaveMode.ErrorIfExists  case _ => throw new IllegalArgumentException(s"Unknown save mode: $saveMode. " +   "Accepted modes are 'overwrite', 'append', 'ignore', 'error'.") } this}

DataFrameWriter.save()

1. save將結(jié)果保存?zhèn)魅氲穆窂健?/p>

/** * Saves the content of the [[DataFrame]] at the specified path. * * @since 1.4.0 */def save(path: String): Unit = { this.extraOptions += ("path" -> path) save()}

2.  追蹤save方法。

/** * Saves the content of the [[DataFrame]] as the specified table. * * @since 1.4.0 */def save(): Unit = { ResolvedDataSource(  df.sqlContext,  source,  partitioningColumns.map(_.toArray).getOrElse(Array.empty[String]),  mode,  extraOptions.toMap,  df)}

3.  其中source是SQLConf的defaultDataSourceName
private var source: String = df.sqlContext.conf.defaultDataSourceName
其中DEFAULT_DATA_SOURCE_NAME默認參數(shù)是parquet。

// This is used to set the default data sourceval DEFAULT_DATA_SOURCE_NAME = stringConf("spark.sql.sources.default", defaultValue = Some("org.apache.spark.sql.parquet"), doc = "The default data source to use in input/output.")

DataFrame.scala中部分函數(shù)詳解:

1. toDF函數(shù)是將RDD轉(zhuǎn)換成DataFrame

/** * Returns the object itself. * @group basic * @since 1.3.0 */// This is declared with parentheses to prevent the Scala compiler from treating// `rdd.toDF("1")` as invoking this toDF and then apply on the returned DataFrame.def toDF(): DataFrame = this

2.  show()方法:將結(jié)果顯示出來

/** * Displays the [[DataFrame]] in a tabular form. For example: * {{{ *  year month AVG('Adj Close) MAX('Adj Close) *  1980 12  0.503218    0.595103 *  1981 01  0.523289    0.570307 *  1982 02  0.436504    0.475256 *  1983 03  0.410516    0.442194 *  1984 04  0.450090    0.483521 * }}} * @param numRows Number of rows to show * @param truncate Whether truncate long strings. If true, strings more than 20 characters will *       be truncated and all cells will be aligned right * * @group action * @since 1.5.0 */// scalastyle:off printlndef show(numRows: Int, truncate: Boolean): Unit = println(showString(numRows, truncate))// scalastyle:on println

追蹤showString源碼如下:showString中觸發(fā)action收集數(shù)據(jù)。

/** * Compose the string representing rows for output * @param _numRows Number of rows to show * @param truncate Whether truncate long strings and align cells right */private[sql] def showString(_numRows: Int, truncate: Boolean = true): String = { val numRows = _numRows.max(0) val sb = new StringBuilder val takeResult = take(numRows + 1) val hasMoreData = takeResult.length > numRows val data = takeResult.take(numRows) val numCols = schema.fieldNames.length

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
中文字幕欧美日韩| 亚洲福利视频专区| www在线播放| 高清不卡一区二区| 在线免费视频一区二区| 麻豆精品99| 亚洲国产欧美日韩精品| 国产婷婷一区二区| 日韩在线视频在线观看| 国产主播中文字幕| 久久中文免费视频| 国产极品嫩模在线视频一区 | 日韩中文字幕在线视频播放| 欧美日韩激情在线一区二区三区 | 日韩av一区二| 国产色综合网| 亚洲黄页一区| 欧美日韩三级在线| 91www成人久久| 99在线精品视频免费观看20| 国产视频2区| 久久99精品久久久久子伦| 久草亚洲一区| a天堂中文在线官网在线| 尤物在线精品| 91精品国产免费久久综合| 国产日韩第一页v| 欧美日韩国产成人| 精品久久久久久无| 在线中文字幕网站| 日本a口亚洲| 欧美婷婷精品激情| 欧美在线视频第一页| 欧美日韩综合在线| 日韩欧美国产黄色| 中文字幕视频在线观看| 亚洲视频在线观看三级 | 一级日本免费的| 欧美日韩综合在线观看| 欧美二三四区| 国产最新在线| 日韩精品三级| 国产亚洲视频中文字幕视频| 日韩中文字幕在线观看视频| 精品国产1区2区3区| 欧美日韩高清不卡| 欧美不卡视频一区| 日韩在线中文字幕| 久久久精品福利| 91亚洲国产| 国产欧美日韩不卡| 大香一本蕉伊线亚洲网| 欧美日韩精品中文字幕| 77777_亚洲午夜久久多人| 免费在线国产| 91精品国产色综合久久不卡蜜臀| 欧美日韩午夜在线| 国产成人综合精品| 美女黄a一级视频| 久久视频在线免费观看| 九九精品调教| 91九色在线播放| 日韩午夜中文字幕| av免费在线播放| 婷婷精品进入| 国产一区成人| 中文字幕亚洲乱码| 在线日韩欧美| 麻豆一区二区99久久久久| 在线欧美一级视频| 精品人妻一区二区三区视频| 黄色在线资源| 视频一区三区| 91久久精品视频| 日韩免费不卡avV| 一区二区视频国产| 亚洲乱码中文字幕| 日韩精品免费视频一区二区三区| 欧美日韩精品在线视频| 中文字幕在线播出| 国产欧美在线观看| 欧美性生交大片免费| 一级片免费在线播放| 日韩在线视频观看| 日本啊v在线| 精品久久久三级| 91精品国产日韩91久久久久久| 国产丝袜一区二区| 人妻一区二区三区免费| 久久久99久久精品欧美| 一区二区日韩免费看| 中文字幕在线视频网| 精品福利一区二区三区| 91精品国产综合久久香蕉的特点| 欧美日韩一二三| 欧美日韩精品在线 | 欧美 日韩 国产 在线| 在线观看av的网站| 精品久久香蕉国产线看观看gif| 天天综合天天添夜夜添狠狠添| 日韩在线视频免费观看| 精品日韩在线| 国产激情在线观看| 欧美日韩精品区| 日韩国产一区| 日韩午夜一区| 香蕉视频亚洲一级| 欧美不卡123| 国产欧美日韩成人| 国产一级片在线播放| 中文字幕日韩亚洲| 欧美日韩在线播放一区| 国产精品视频福利一区二区| 91麻豆精品国产91久久久使用方法| 人人做人人澡人人爽欧美| 久久精品国产成人一区二区三区| 亚洲高清精品视频| 精品视频www| 欧美日韩精品不卡| 日韩中文字幕综合| 日韩三级高清在线| 国产三级做爰在线观看| 国产区高清在线| 国产免费一级| 国产一级一片免费播放| 在线一区免费| 午夜国产在线视频| 欧美中文字幕在线| 亚洲 欧美综合在线网络| 亚洲成年网站在线观看| 蜜臀91精品国产高清在线观看| 91久久大香伊蕉在人线| 91精品国产91久久久久久不卡| 欧美日韩性视频一区二区三区 | 中文字幕第一页在线播放| 久久精品国产99| 日韩精品一级| 国产一级片播放| а√天堂8资源中文在线| 91精品国产91久久久久久三级| 亚洲免费福利视频| 91精品在线观看入口| 91精品国产色综合久久久蜜香臀 | 国产视频二区| 欧美在线视频第一页| av影视在线看| 阿v免费在线观看| 精品国产欧美成人夜夜嗨| 一区二区三区在线免费| 日韩 欧美 中文| 日韩精品视频中文字幕| 美女黄a一级视频| 国产激情三区| 亚洲福利精品视频| 国产一二三四| 国产欧美日韩在线观看| 欧美一级日韩一级| 区日韩二区欧美三区| 日韩欧美国产午夜精品| 粉嫩喷白浆久久| 欧美 日韩 中文字幕| 精品视频999| 亚洲国产91精品在线观看| 九九视频精品免费| 欧美一级久久久久久久久大| 久久久精品福利| 欧美色视频一区二区三区在线观看| 久久精品在线免费观看| 在线一区免费| 亚洲乱码中文字幕| 欧美日韩性视频在线| 91精品日本| 欧美亚洲国产日韩2020| 日韩一级免费视频| 中文字幕在线国产| 国产 欧美 在线| 日韩美女中文字幕| 国产激情在线视频| 精品熟女一区二区三区| 日韩欧美在线中文字幕| 中文字幕亚洲一区在线观看| 一区二区日韩免费看| 国产一区日韩欧美| 欧美日韩在线精品成人综合网 | 日韩欧美中文在线| 最近中文字幕第一页| 亚洲乱码中文字幕综合| 国产不卡一区| 国产亚洲视频中文字幕视频| 国产手机精品视频| 欧美日韩国产综合视频在线观看中文| 久久精品不卡| 在线观看免费国产小视频| 精品视频www| 91精品国产91久久久久久不卡| 亚洲一区在线观看免费| 国产一区在线精品| 91久久中文| 成人一区而且| 搞黄在线观看| 影音先锋一区二区资源站| 日本xxxwww免费视频| 99这里有精品视频| 免费国产成人看片在线| 九九视频精品免费| 蜜桃精品视频| av一区在线观看| 蜜桃视频中文字幕| 91精品国产自产在线观看永久∴| 蜜桃精品视频| 亚洲v中文字幕| 欧美日韩午夜精品| 日韩三级高清在线| 欧美国产小视频| 精人妻一区二区三区| 视频一区二区不卡| 欧美日韩国产一级片| 久久久久久99精品| 国产在线不卡av| 国产日韩精品在线看| 久久精品在线观看| 1区2区在线| 日韩欧美中文视频| 久久人人精品| 亚洲 欧美 中文字幕| 中文字幕高清在线播放| 亚洲欧洲一区二区天堂久久| 日韩欧美在线中字| 91精品在线观看视频| 日韩中文字幕在线一区| 国内精品99| 亚洲一区中文字幕在线观看| 亚洲视频在线观看三级 | 91久久精品国产| 国产欧美三级| 中文字幕高清在线播放| 国产高清一级片| 日韩欧美色综合| 欧美日韩中文字幕在线观看| 久久精品不卡| 中文在线а√在线8| 国产欧美中文在线| 日韩亚洲欧美中文在线| 欧美三级免费观看| 国产一区久久| 日韩在线视频中文字幕| 国产福利三区| 亚洲福利视频专区| 日韩欧美国产黄色| 亚洲欧美中文字幕| 91精品国产综合久久久久| 日韩精品免费观看视频| 国产字幕在线看| 91精品国产综合久久精品| 亚洲国产福利视频| 日韩欧美国产一二三区| 亚洲高清免费一级二级三级| 久久久精品日韩欧美| 国产卡1卡2卡三卡在线| 国产成人精品999| 亚洲va中文字幕| 国产香蕉精品视频| 在线欧美一级视频| 狠狠色综合色区| 香蕉精品久久| 欧美日韩综合在线免费观看| 精品三级久久| 中文欧美字幕免费| 欧美午夜精品在线| 久久久精品网| 日韩不卡高清视频| 精品日韩在线| 91精品国产综合久久久久| 91精品视频免费在线观看| 国产婷婷色一区二区三区| 粉嫩喷白浆久久| 国产激情久久久| 欧美不卡123| 国产成人精品综合网站| 亚洲成在线观看| 亚洲国产午夜精品| 中文字幕狠狠干| 欧美日韩中文字幕视频| 精品欧美日韩在线| a级在线免费观看| 欧美日韩午夜在线| 免费国产h视频在线观看86| 国产69精品久久app免费版| 国产三级中文字幕| 视频一区二区不卡| 在线视频一区二区三区在线播放 | 国产午夜精品视频| 中文字幕精品一区二区三区在线| 精品亚洲国内自在自线福利| 欧美婷婷久久| 亚洲第一中文字幕| 国产九九在线| 国产99在线 | 亚洲| 99国产成 人 综合 亚洲欧美| 日韩午夜黄色| 日韩欧美国产免费播放| 欧美国产亚洲一区| 色综合婷婷久久| 精品国产1区2区3区| 国产不卡一区二区在线观看| 日韩精品视频在线播放| 首页国产欧美久久| wwwwww国产| 国产激情在线| 亚洲欧美99| 久久精品卡一| 日韩欧美中文字幕公布| 国产免费久久久| 亚洲社区在线| 亚洲成人7777| 日韩 国产 一区| 91久久精品午夜一区二区| 中文字幕在线导航| 一区二区在线观看不卡| 精品国产乱码久久久久久蜜臀| 国产亚洲污的网站| 日韩中文字幕视频在线观看| 亚洲一区精品电影| 欧美国产综合视频| 日韩欧美国产亚洲| 日韩中文首页| 日韩精品视频免费在线观看| 国产不卡在线| 91精品视频播放| 欧美激情一区二区三区在线| 国产黄在线播放| 在线视频你懂得一区| 久久精品国产视频| 欧美三级日韩三级| 久久婷婷国产| 中文字幕狠狠干| 精品国产免费视频| 91精品综合久久久久久| www.日韩免费| 在线不卡一区二区| 国产小视频免费在线网址| 69堂精品视频在线播放| 国产最新在线| 欧美91精品| 欧美日韩精品免费看| 国产在线第一页| 国产福利不卡| 色综合天天性综合| av中文在线播放| 欧美大片在线观看一区| 国产亚洲二区| 又黄又www的网站| 国产手机视频一区二区| www日韩在线观看| 国产69精品久久app免费版| 色www精品视频在线观看| 中文在线不卡| 在线视频一区二区三区在线播放 | 麻豆精品99| 成人禁用看黄a在线| 欧美日韩国产系列| 日韩午夜黄色| 日韩在线精品视频| 国产亚洲短视频| 77777_亚洲午夜久久多人| 欧美日韩国产免费观看| 国产欧美日韩视频在线| 国内精品不卡| 一区二区三区精品99久久| 亚亚洲欧洲精品| 国产一级视频| 一区二区在线高清视频| 日韩福利视频导航| 国产一卡二卡3卡4卡四卡在线| 久久精品国产2020观看福利| 国产午夜精品久久| 久久99精品国产| 日韩欧美99| 国产超级va在线视频| 中文字幕欧美日韩在线| 欧美三级免费观看| 久久99久久久久久久噜噜| 国产一区不卡精品| 欧美国产一级片| 国产一二三精品| 日韩视频精品| 亚洲专区一区| 国产 中文 字幕 日韩 在线| √天堂资源中文www| 国产乱国产乱老熟300| 91亚洲国产高清| 日韩一级在线免费观看| 欧美日韩中文字幕| av午夜在线| 欧美久久久网站| 日韩av在线中文字幕| 中文字幕亚洲乱码| 国产亚洲视频中文字幕视频| 国产日产一区二区| 国产一卡二卡3卡4卡四卡在线|