2014-09-19 67 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)) 

解决了这个问题。

相关问题