Apache spark 与火花系列化混淆

Apache spark 与火花系列化混淆,apache-spark,Apache Spark,我需要读取几个csv文件,并将几个列从字符串转换为双精度 代码如下: def f(s:String):Double = s.toDouble def readonefile(path:String) = { val data = for { line <- sc.textFile( path ) arr = line.split(",").map(_.trim) id = arr(33) } yield { v

我需要读取几个csv文件,并将几个列从字符串转换为双精度

代码如下:

  def f(s:String):Double = s.toDouble

  def readonefile(path:String) = {
    val data = for {
      line <-  sc.textFile( path )
      arr = line.split(",").map(_.trim)
      id = arr(33)
    } yield {
        val countings = ((9 to 14) map arr).toVector map f
        id -> countings.toVector
      }
    data
  }
def(s:String):Double=s.toDouble
def readonefile(路径:字符串)={
val数据=用于{
行计数.toVector
}
数据
}
如果我显式地编写
toDouble
(例如,代码中的函数
f
),spark会抛出错误
java.io.IOException
java.lang.exceptionininitializerror

但是,如果我将计数更改为

val countings=(9到14)map arr.to向量map(uu.toDouble)

然后一切正常

函数
f
是否可序列化

编辑:

有人说这和 但为什么它不抛出
任务不可序列化
异常呢

Scala版本2.10

Spark版本1.3.1


环境:Thread client

我们可以将函数f移动到一个伴随对象中。我还使转换避免了for循环,我不确定它是否在做您想要的事情。注意,您可能希望使用spark csv,而不仅仅是在逗号上拆分,但希望这能说明这一点:

  object Panda {
    def f(s:String):Double = s.toDouble
  }

  def readonefile(path:String) = {
      val input = sc.textFile( path )
      arrs = input.map(line => line.split(",").map(_.trim))
      arrrs.map(arr => (arr(33).toDouble,
                        ((9 to 14) map arr).map(Panda.f).toVector)
  }

可能是@maasg的重复,我认为它们很相似。但是如何解释它抛出的错误消息。我希望看到NotSerializableException。我对您正在执行的主要for循环有点困惑,您能解释一下您试图实现的目标吗?@Holden我正在读取csv文件中的行。arr是存储csv文件中一行的所有列值的数组。我希望将第9列到第14列转换为Double。第33列是此行的id。最后我得到了一个RDD[id->column9 to column 14 Double]Hi@Holden,我不知道它是如何解决我的问题的。为什么程序抛出java.io.IOException或java.lang.ExceptionInInitializerError?它将f放入一个campion对象中。首先,我不确定是什么导致了错误,可能是序列化问题。为什么同伴对象可以修复它?拥有同伴对象可以避免Spark尝试序列化整个类