【问题标题】:Spark type mismatch error火花类型不匹配错误
【发布时间】:2015-06-07 12:35:55
【问题描述】:

我有以下功能:-

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)
                                ^

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

【问题讨论】:

    标签: scala apache-spark type-mismatch


    【解决方案1】:

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

    假设要提取文件路径,那么您需要的是这样的:

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

    或者简单地说:

    logData.map(_._1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2013-01-16
      • 2014-02-05
      • 2018-06-08
      • 2012-02-16
      • 2012-02-25
      相关资源
      最近更新 更多