sc.textFile(filePath).flatMap(line==>line.split(「\\s+」)).map(word==>(word,1)).reduceByKey(_+_) java
獲得的結果RDD形式是:RDD[String,Int]型 編程
咱們經過:RDD.saveAsFile(path) 把計算結果保存爲文件,獲得的文件以下: 性能
每一個文件的內容: 學習
引深一步思考: 大數據
若是個人job是每日迭代運算的: spa
好比第一天的時候,我運行出告終果並存儲在目錄/result/...了(就像上面的形式,生成了:part_0000、part_0001......); scala
次日我須要對於今天新增的文件new.txt從新和昨天的結果文件/result/...運算, code
這類型的需求該如何解決呢? 對象
目前我遇到的問題是: 字符串
當我抽象爲單個part文件和新文件進行計算時候,我遇到了問題:
val new_file = sc.textFile("../xx").flatMap(line=>line.split("\\n")).map(word=>(word,1)).reduceByKey(_+_) val old_file = sc.textFile("../xx").flatMap(line=>line.split("\\n")) new_file.union(old_file)//報錯
報錯的緣由是:
new_file這個RDD的數據類型是(String,Int)型,而old_file的RDD是(String)型,類型不匹配致使不能union,因此會提示報錯!
解決此問題的方法就是如何從old_file文件讀取數據集並且還能轉化爲RDD(String,Int),這個old_file自己也是(String,Int)型。
目前的需求:若是一次性能把諸如:part_0000、part_0001……文件裏的內容都自動轉化爲RDD(String,Int) ,問題就解決了
另外一種方式:
若是把歷史計算結果經過saveAsObjectFile("F:\\dir_name")存儲爲對象呢?
讀取的時候經過sc.objectFile("F:\\history\\part-...") 這個方法傳入什麼樣的參數能夠講part文件碎布片都讀取出來?
並且讀取出來的RDD怎麼才能轉換爲RDD(String,Int) ?
求解,很是感謝!
------------------------------------------------------------------------------------------------
解決一:從saveAsFile(path) 生成的結果中提取數據(有點像反序列化)
通過在社區裏衆人的幫助,其中 無邊落木@play2 給出了一種將字符串轉化爲(String,Int)的方法,實現是:
sc.textFile("F:\\result").flatMap(line=>line.split("\\n")).map(cloumn => { val v = cloumn.replace("(","").replace(")","").split(","); (v(0),v(1).toInt ) })
發現textFile能夠出來此目錄下的文件分片,程序中的核心是:取到一行,替換後按「,」分割,組成(String,Int)返回出去,就能夠了!
很是感謝!
解決二:從saveAsFile(path) 生成的結果中提取數據 -- 待解決