为什么Scala编译器会因缺少JavaSparkContext过滤器的参数类型而失败?

为什么Scala编译器会因缺少JavaSparkContext过滤器的参数类型而失败?,scala,apache-spark,Scala,Apache Spark,我正在尝试向我的程序中添加过滤器,如中所示: 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).c

我正在尝试向我的程序中添加
过滤器
,如中所示:

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
有什么想法吗

val numAs =  twitterFeed.filter((i: String) => i.contains(value))
解决了问题。

您真的应该改用。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中的类型推断需要类型上下文来推断
参数的类型

val numAs = twitterFeed.filter(line => line.contains(value))
它显然是
String
类型,但是使用Java版本的SparkContext——您只会丢失类型信息

如果您使用
SparkContext
,上述行可以进一步简化为:

val numAs = twitterFeed.filter(_.contains(value))
甚至:

twitterFeed.filter(_ contains value)

所有的好东西都消失了。

什么是
twitterFeed
?在您链接的示例中,文件是字符串的集合,在您的示例中是不同的,您应该编辑您的问题以使其更易于理解。@EndeNeu,即使我使用的行与示例val file=spark.textFile(“hdfs://...)val errors=file.filter(line=>line.contains(“错误”))它仍然在同一个地方给出了相同的错误。“一个Java友好版本的SparkContext,返回JavaRDD,并使用Java集合而不是Scala集合。”这是最新版本。试试SparkContext吧?