我的任務是編寫一個讀取大文件(不適合內存)的代碼將其逆轉並輸出最常用的五個單詞。
我已經寫下了下面的代碼,它完成了這項工作。Spark代碼優化
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object ReverseFile {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Reverse File")
conf.set("spark.hadoop.validateOutputSpecs", "false")
val sc = new SparkContext(conf)
val txtFile = "path/README_mid.md"
val txtData = sc.textFile(txtFile)
txtData.cache()
val tmp = txtData.map(l => l.reverse).zipWithIndex().map{ case(x,y) => (y,x)}.sortByKey(ascending = false).map{ case(u,v) => v}
tmp.coalesce(1,true).saveAsTextFile("path/out.md")
val txtOut = "path/out.md"
val txtOutData = sc.textFile(txtOut)
txtOutData.cache()
val wcData = txtOutData.flatMap(l => l.split(" ")).map(word => (word, 1)).reduceByKey(_ + _).map(item => item.swap).sortByKey(ascending = false)
wcData.collect().take(5).foreach(println)
}
}
的問題是,我是新來的火花和Scala,並且你可以在代碼中看到我第一次讀取文件扭轉它保存然後讀取它扭轉和輸出的五個最頻繁出現的詞彙。
- 有沒有辦法告訴火花保存TMP和工藝wcData(無需保存,打開文件)在同一時間,否則它像讀取文件的兩倍。
- 從現在開始,我要解決很多火花,所以如果有代碼的任何部分(不像絕對路徑名......特定的火花),你可能認爲可以寫得更好i'de欣賞它。
拿(5)收集,爲什麼? – eliasah
謝謝你的答案,但幾個筆記:1 - 沒有合併火花將文件保存爲分區我想保存爲一個,2-採取(5)之前collect()給編譯錯誤(沒有足夠的參數收集),3 - 你能否給我提供一個關於所有這個地圖的教程的鏈接(_ + _/_._ 2)不需要的東西。非常感謝 – Epsilon
1 - 好的。根據需要更改。 2 - 修正了收集。 3 - https://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala#8000934 – Reactormonk