2014-09-19 62 views
2

我想如圖the examples到我的程序中添加filter爲什麼Scala編譯器會失敗並且缺少JavaSparkContext過濾器的參數類型?

val logFile = "/tmp/master.txt" 
val sc = new JavaSparkContext("local[4]", "Twitter Analyzer", "/home/welcome/Downloads/spark-1.1.0/",Array("target/scala-2.10/Simple-assembly-0.1.0.jar")) 
val twitterFeed = sc.textFile(logFile).cache() 

while (iterator.hasNext) { 
    val value = iterator.next() 
    val numAs = twitterFeed.filter(line => line.contains(value)) 
    numAs.saveAsTextFile("/tmp/output/positive/" + value) 
} 

我得到的編譯錯誤如下:

[info] Compiling 1 Scala source to /home/siva/file1/target/scala-2.10/classes... 
[error] /home/siva/file1/src/main/scala/com/chimpler/example/twitter/Tweet.scala:27: missing parameter type 
[error]  val numAs = twitterFeed.filter(line => line.contains(value)) 
[error]         ^
[error] one error found 
[error] (compile:compile) Compilation failed 
[error] Total time: 5 s, completed 19 Sep, 2014 1:31:26 PM 

什麼想法?

+0

什麼是「twitterFeed」?在這個例子中,你鏈接的文件是一些字符串集合,在你的情況是不同的,你應該編輯你的問題,使其更容易理解。 – 2014-09-19 08:31:46

+0

@EndeNeu即使我使用與示例中給出的相同的行val file = spark.textFile(「hdfs:// ...」) val errors = file.filter(line => line.contains(「ERROR」 ))它仍然在相同的地方給出相同的錯誤。 – Siva 2014-09-19 08:41:42

+1

「一個Java友好的SparkContext版本,它返回JavaRDDs和_works與Java collections_而不是Scala。」這是[JavaSparkContext的API描述](http://spark.apache.org/docs/latest/api/java/org/apache/spark/api/java/JavaSparkContext.html)。試試SparkContext?詳細解釋請參見 – groverboy 2014-09-19 09:03:38

回答

4

As @groverboy advised in the comment你應該真的使用org.apache.spark.SparkContext來代替。 Spark編程指南的Initializing Spark對此也很清楚。

import org.apache.spark._ 

val conf = new SparkConf() 
    .setMaster("local[4]") 
    .setAppName("Twitter Analyzer") 
    .setSparkHome("/home/welcome/Downloads/spark-1.1.0/") 
    .setJars(Seq("target/scala-2.10/Simple-assembly-0.1.0.jar")) 
val sc = new SparkContext(conf) 

這樣做的原因是Scala的類型推斷需要類型的上下文來推斷line參數的類型。

val numAs = twitterFeed.filter(line => line.contains(value)) 

這顯然的String類型,但使用SparkContext的Java版本 - JavaSparkContext - 你只是失去類型的信息。

只要你使用SparkContext上面的線可以進一步簡化爲:

val numAs = twitterFeed.filter(_.contains(value)) 

甚至:

twitterFeed.filter(_ contains value) 

所有的好東西只是SparkContext之遙。

+0

+1。 – groverboy 2014-09-24 03:45:22

2
val numAs = twitterFeed.filter((i: String) => i.contains(value)) 

解決了這個問題。

相關問題