7.Spark數(shù)據(jù)讀取與保存

1. 常見數(shù)據(jù)源

  • 文件格式與文件系統(tǒng)
    對于存儲在本地文件系統(tǒng)或分布式文件系統(tǒng)(比如NFS脑漫、HDFS街望、Amazon S3 等)中的數(shù)據(jù)飞蚓,Spark 可以訪問很多種不同的文件格式缩擂,包括文本文件鼠冕、JSON、SequenceFile胯盯,以及protocol buffer懈费。

  • Spark SQL中的結(jié)構(gòu)化數(shù)據(jù)源
    Spark SQL 模塊,它針對包括JSON 和Apache Hive 在內(nèi)的結(jié)構(gòu)化數(shù)據(jù)源博脑,為我們提供了一套更加簡潔高效的API憎乙。

  • 數(shù)據(jù)庫與鍵值存儲
    Spark 自帶的庫和一些第三方庫票罐,可以用來連接Cassandra、HBase泞边、Elasticsearch 以及JDBC 源该押。

2.文件格式

Spark支持的一些文件格式
2.1 文本文件
  • 將一個文本文件讀取為RDD 時,輸入的每一行都會成為RDD 的一個元素阵谚。

  • 將多個完整的文本文件一次性讀取為一個pair RDD蚕礼,其中鍵是文件名,值是文件內(nèi)容梢什。

2.1.1 讀取本地文件
  • 讀取單個文件:textFile(fileName奠蹬,minPartitions) ,如果要控制分區(qū)數(shù)的話绳矩,可以指定minPartitions罩润。

注意:textFile()方法也可以讀取文件夾,將目錄作為參數(shù)翼馆,會將目錄中的數(shù)據(jù)都讀入到RDD中割以。

//在Scala中讀取一個文件
val input = sc.textFile("file:///home/holden/repos/spark/README.md")
//在Java中讀取一個文件
JavaRDD<String> input = sc.textFile("file:///home/holden/repos/spark/README.md")
  • 讀取一個目錄中的文件:wholeTextFiles(),方法會返回一個pair RDD应媚,其中鍵是輸入文件的文件名严沥。

Spark 支持讀取給定目錄中的所有文件,以及在輸入路徑中使用通配字符(如part-*.txt)中姜。

//使用wholeTextFiles讀取文件夾
val input = sc.wholeTextFiles("/user/admin/mrwinter/chapter05/txt/")
input.collect().foreach(println)
使用wholeTextFiles讀取文件夾輸出結(jié)果
使用textFile讀取文件夾
val input = sc.textFile("/user/admin/mrwinter/chapter05/txt/")
input.collect().foreach(println)
使用textFile讀取文件夾輸出結(jié)果
//在Scala 中求每個文件的平均值
val input = sc.wholeTextFiles("file://home/holden/salesFiles")
val result = input.mapValues{y =>
  val nums = y.split(" ").map(x => x.toDouble)
  nums.sum / nums.size.toDouble
}
2.1.2 保存本地文件

saveAsTextFile() 方法接收一個路徑消玄,并將RDD 中的內(nèi)容都輸入到路徑對應(yīng)的文件中。Spark 將傳入的路徑作為目錄對待丢胚,會在那個目錄下輸出多個文件翩瓜。

//在Scala中將數(shù)據(jù)保存為文本文件
inputRDD.saveAsTextFile(outputFile)
2.2 JSON文件
  • 讀取JSON 數(shù)據(jù)的最簡單的方式是將數(shù)據(jù)作為文本文件讀取,然后使用JSON 解析器來對RDD 中的值進行映射操作携龟。
  • 也可以使用JSON 序列化庫來將數(shù)據(jù)轉(zhuǎn)為字符串兔跌,然后將其寫出去。
  • 在Java 和Scala 中也可以使用一個自定義Hadoop 格式來操作JSON 數(shù)據(jù)峡蟋。
  • 還可以使用Spark SQL 讀取JSON 數(shù)據(jù)坟桅。

測試json文件:

{"name":"王陽","age":32}
{"name":"李偉","age":22}
{"name":"劉涵","age":41}
{"name":"張麗","age":23}
{"name":"楊梅","age":34}

讀取JSON文件
使用Jackson來解析JSON文件

import org.json4s.ShortTypeHints
import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.Serialization

case class Person(name:String,age:Int)

implicit val formats = Serialization.formats(ShortTypeHints(List()))
val input = sc.textFile("/user/admin/mrwinter/chapter05/person.json")
val result = input.collect().map(x => parse(x).extract[Person])

//保存JSON文件用saveASTextFile(outputFile)即可
val save_json = sc.parallelize(result)
save_json.saveAsTextFile("/user/admin/mrwinter/chapter05/save_person.json")
運行結(jié)果
2.3 逗號分隔值與制表符分隔值

逗號分隔值(CSV)文件每行都有固定數(shù)目的字段,字段間用逗號隔開(在制表符分隔值文件蕊蝗,即TSV 文件中用制表符隔開)仅乓。

2.3.1 讀取CSV

讀取CSV/TSV 數(shù)據(jù)和讀取JSON 數(shù)據(jù)相似,都需要先把文件當(dāng)作普通文本文件來讀取數(shù)據(jù)蓬戚,再對數(shù)據(jù)進行處理夸楣。

//CSV文件
holden,panda
hotholden,notpanda
spark,bear
//在Scala 中使用textFile() 讀取CSV
import java.io.StringReader
import au.com.bytecode.opencsv.CSVReader

val input = sc.textFile("/user/admin/mrwinter/chapter05/animal.csv")
val result = input.map{ line =>
  val reader = new CSVReader(new StringReader(line))
  reader.readNext()
}
result.collect().foreach(x => println(x(0), x(1)))
輸出結(jié)果
//在Java 中使用textFile() 讀取CSV
import au.com.bytecode.opencsv.CSVReader;
import Java.io.StringReader;

JavaRDD<String> csvFile1 = sc.textFile("/user/admin/mrwinter/chapter05/animal.csv");
JavaPairRDD<String[]> csvData = csvFile1.map(line ->
  new CSVReader(new StringReader(line)).readNext();
);

如果在字段中嵌有換行符,就需要完整讀入每個文件,然后解析各段裕偿。如果每個文件都很大洞慎,讀取和解析的過程可能會很不幸地成為性能瓶頸。

2.3.2 保存CSV文件
saveAsTextFile(outputFile)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘿棘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旭绒,更是在濱河造成了極大的恐慌鸟妙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挥吵,死亡現(xiàn)場離奇詭異重父,居然都是意外死亡,警方通過查閱死者的電腦和手機忽匈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門房午,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丹允,你說我怎么就攤上這事郭厌。” “怎么了雕蔽?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵折柠,是天一觀的道長。 經(jīng)常有香客問我批狐,道長扇售,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任嚣艇,我火速辦了婚禮承冰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘食零。我一直安慰自己困乒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布慌洪。 她就那樣靜靜地躺著顶燕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冈爹。 梳的紋絲不亂的頭發(fā)上涌攻,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音频伤,去河邊找鬼恳谎。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的因痛。 我是一名探鬼主播婚苹,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸵膏!你這毒婦竟也來了膊升?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤谭企,失蹤者是張志新(化名)和其女友劉穎廓译,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體债查,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡非区,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盹廷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片征绸。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俄占,靈堂內(nèi)的尸體忽然破棺而出管怠,到底是詐尸還是另有隱情,我是刑警寧澤颠放,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布排惨,位于F島的核電站,受9級特大地震影響碰凶,放射性物質(zhì)發(fā)生泄漏暮芭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一欲低、第九天 我趴在偏房一處隱蔽的房頂上張望辕宏。 院中可真熱鬧,春花似錦砾莱、人聲如沸瑞筐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聚假。三九已至,卻和暖如春闰非,著一層夾襖步出監(jiān)牢的瞬間膘格,已是汗流浹背忿峻。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工腔剂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牙言。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像菜秦,于是被迫代替她去往敵國和親甜害。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 從周三考完到今天 放縱了三天 我想 應(yīng)該重新振作起來 開始前行了 一遍又一遍的問自己 自己以后想變成什么模樣 想成...
    平底鞋小王子閱讀 393評論 1 1
  • 今天推薦的信息圖表設(shè)計師是:Steve Duenes 和 Xaquín G.V.球昨,這兩位設(shè)計師曾在NYT有過工作經(jīng)...
    HungerLyndon閱讀 196評論 0 0
  • 本文參加【六專題】八月征文《月圓之夜》www.reibang.com/p/46e015dd7ad9 今年中秋褪尝,老九...
    張張不吃魚閱讀 465評論 2 10
  • 文/雅雅 01/ “關(guān)于創(chuàng)作” 只是用情感活著是悲劇河哑,只是用明智活著是正劇。我喜歡情感與理智之間的喜劇龟虎。 人們太喜...
    Sophia雅雅閱讀 350評論 0 0