2016-09-24 49 views
-3


我想打一個對象,而不是的println。
想讓輸出作爲對象,而不是的println

文本文件會是什麼樣
「長野,蘋果」
「長野,黃花梨」
「德州,柚」
「力,番石榴」
「力,番石榴」

和導致像
「(長野,蘋果,1)」
「(長野,梨,1)」
「(得克薩斯州,葡萄柚,1)」
「(RIO,番石榴,2)」

def main(args: Array[String]) = { 

    val conf = new SparkConf() 
    .setAppName("WordCount") 
    .setMaster("local") 
    val sc = new SparkContext(conf) 

    // read text info 
    val textfile = sc.textFile("C:\\fruitbox.csv") 
    twitter.filter(_.nonEmpty) 
    val map = twitter.map { word => (word, 1) } 
    .reduceByKey(_ + _) 
    .foreach(println) // ← want to do something about this row 
} 

,但我想打的println的結果是這樣的

.foreach(
     fruitbox.setCity(_.split(",")[0]) 
     fruitbox.setApple(_.split(",")[1]) 
     ... 
    ) 

好像語法 的簡單的知識,但我不能想出解決辦法。

回答

0

你需要的功能來考慮的,或者你會變得瘋狂。更換foreachmap負責這種形式的函數:

.map(myInputTuple=>MyCaseClass(myInputTuple._0,myInputTuple._1,myInputTuple._2)) 

你知道case類?如果你不這樣做,你應該看看並定義你自己來保存你處理的數據。否則,如果你想建立一個具有制定者一個已經存在的類的具體實例,可以這樣來做:

.map(myInputTuple=>{ 
val myInstance = new myClass() 
myInstance.setField1(myInputTuple._0) 
... 
myInstance 
} 
) 

心靈括號:{}這些定義範圍,你可以寫非功能代碼這個範圍的最後一個值將是返回的值,在這個例子中是你的類的實例。

此外,當您發佈關於星火東西,儘量做到明確你在每一步處理,以便更容易編寫代碼來幫助你的類型。

0

感謝您的幫助Chobeat!
我固定的foreach映射和增加了一些行 但是編譯器跳過它..
我這麼想嗎?

val map = twitter.map { word => (word, 1) } 
    .reduceByKey(_ + _) 
    .map(obj => { // ← SKIPS FROM HERE 
    var arg = obj._1.split(",") 
    val twitterInfo = new TwitterInfo(arg.apply(0), arg.apply(1), obj._2) 
    list:+=(twitterInfo) 
}) 
0

什麼是'list:+ =(twitterinfo)'? 您不應該使用可變狀態,而是從「映射」函數返回結果。

此外,我在問題中注意到'twitter.filter'和'twitter.map'是兩個不同的表達式,都使用'twitter'變量作爲起始點,這意味着'過濾器'不被使用,您仍然映射空記錄。