如何重用Spark的計算結果?--遇到的問題--待解決(已解決字符串文件存儲的方式)


     word_count 在大數據學習上,就行剛開始編程時候打印「 Hello world 」同樣, Spark word_count 的解決實現確實比較優雅,只須要一條語句就解決了:

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_0000part_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的數據類型是(StringInt)型,而old_fileRDD是(String)型,類型不匹配致使不能union,因此會提示報錯!

解決此問題的方法就是如何從old_file文件讀取數據集並且還能轉化爲RDD(String,Int),這個old_file自己也是(String,Int)型。

目前的需求:若是一次性能把諸如:part_0000part_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) 生成的結果中提取數據 -- 待解決

相關文章
相關標籤/搜索