Apache spark 与火花系列化混淆
我需要读取几个csv文件,并将几个列从字符串转换为双精度 代码如下: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
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尝试序列化整个类