2015-12-02 19 views
0

我想打印文件中的內容,下面的代碼是我如何做到這一點。由於類型不匹配(單元和字符串),不能像這樣打印?

import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.SparkConf 
import org.apache.spark.rdd.RDD 

object SimpleSpark { 
    def main(arg: Array[String]) = { 
     val distFile = sc.textFile("https://stackoverflow.com/a/path/to/a/file") 
     val aClass: MyClass = new MyClass() 

     val mappedRDD = aClass.doStuff(distFile) 
     mappedRDD.reduce((a, b) => println(a)) 
     // println(mappedRDD.reduce((a, b) => a + b + "\n")) 
     // mappedRDD.foreach(println) 
} 


class MyClass() { 
    def doStuff(rdd: RDD[String]) : RDD[String] = { 
     val field = "Hello!" 
     rdd.map(x => field + x) 
    } 
} 

我的問題是:

的代碼兩個註釋掉線工作正常,但是,這種mappedRDD.reduce((a, b) => println(a))行收到錯誤,如:

[email protected]:Apache-Spark$ sbt package 
[info] Set current project to Simple Project (in build file:/home/cliu/Documents/github/Apache-Spark/) 
[info] Compiling 1 Scala source to /home/cliu/Documents/github/Apache-Spark/target/scala-2.10/classes... 
[error] /home/cliu/Documents/github/Apache-Spark/src/main/scala/SimpleSpark.scala:72: type mismatch; 
[error] found : Unit 
[error] required: String 
[error]   mappedRDD.reduce((a, b) => println(a)) 
[error]           ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 
[error] Total time: 3 s, completed Dec 2, 2015 5:18:24 PM 

爲什麼mappedRDD.reduce((a, b) => println(a))不工作?

爲什麼我打印的是Unit而不是Sting

回答

2

這是因爲println(a)什麼也沒有返回(Unit),而reduce實際上是期望返回String。你應該只返回a

val reduced = mappedRDD.reduce((a, b) => a) 

,然後你可以在reduced執行操作來打印你a的:

reduced.foreach(println) 
+0

你的意思是'reduce'應該總是返回一些東西嗎? – fluency03

+1

是的。函數'(a,b)=> a'要求'a'爲'String'類型。 'println(a)'是'Unit'類型,所以在那裏不起作用。 –

0

作爲替代本·沃森的回答,您可以選擇,以保存RDD放入一個文件或者可能放入Hive。使用foreach的東西是,你不會看到一個接一個地打印出來的元素 - 在實際打印輸出之前,你會得到很多關於檢索每個元素時執行的任務的日誌消息。如果你不想配置日誌記錄,那麼簡單地堅持RDD。

相關問題