火花类型不匹配错误

时间:2015-06-07 12:35:55

标签: scala apache-spark type-mismatch

我有以下功能: -

def doSomething(line: RDD[(String, String)]): (String) = {
       val c = line.toLocalIterator.mkString
       val file2 = KeepEverythingExtractor.INSTANCE.getText(c)
       (file2)
    }      

类型为org.apache.spark.rdd.RDD[(String, String)])String

我有一些存储在hdfs的文件,我必须按如下方式访问: -

val logData = sc.wholeTextFiles("hdfs://localhost:9000/home/akshat/recipes/recipes/simplyrecipes/*/*/*/*")

类型为org.apache.spark.rdd.RDD[(String, String)]

我必须根据doSomething函数

映射这些文件
val mapper = logData.map(doSomething)

但是出现了这样的错误: -

<console>:32: error: type mismatch;
 found   : org.apache.spark.rdd.RDD[(String, String)] => String
 required: ((String, String)) => ?
       val mapper = logData.map(doSomething)
                                ^

我在我的函数中定义了我应该具有什么类型的输入和输出,并且我只根据它给出输入。 为什么会出现此错误,为了纠正此错误,我应该更改什么? 提前谢谢!

1 个答案:

答案 0 :(得分:6)

传递给map函数的不是RDD[(String, String)],而是对(String, String)的序列,因此错误。同样地,当您映射列表时,您不会获得列表本身,而是列表中的元素,一个接一个。

让我们说想要提取文件路径然后您需要的是这样的:

def doSomething(x: (String, String)): String = {
    x match {
        case (fname, content) => fname
    }
}

或简单地说:

logData.map(_._1)