在闭包之外调用函数时会出现奇怪的行为:
任务不可序列化:java.io.NotSerializableException:testing
问题是我需要在类中的代码而不是对象.知道为什么会这样吗?Scala对象是否已序列化(默认?)?
这是一个有效的代码示例:
object working extends App {
val list = List(1,2,3)
val rddList = Spark.ctx.parallelize(list)
//calling function outside closure
val after = rddList.map(someFunc(_))
def someFunc(a:Int) = a+1
after.collect().map(println(_))
}
Run Code Online (Sandbox Code Playgroud)
这是一个非工作的例子:
object NOTworking extends App {
new testing().doIT
}
//adding extends Serializable wont help
class testing {
val list = List(1,2,3)
val rddList = Spark.ctx.parallelize(list)
def doIT = {
//again calling the fucntion someFunc
val after = rddList.map(someFunc(_))
//this will crash (spark lazy)
after.collect().map(println(_))
}
def someFunc(a:Int) …
Run Code Online (Sandbox Code Playgroud) 我试图在我的火花工作中解析json时遇到了一个问题.我使用spark 1.1.0
,json4s
和Cassandra Spark Connector
.抛出的异常是:
java.io.NotSerializableException: org.json4s.DefaultFormats
检查DefaultFormats伴随对象,并且使用此堆栈问题,很明显无法序列化DefaultFormats.问题是现在该做什么.
通过添加关键字transient,我可以看到这张票显然在spark代码库中解决了这个问题,但我不确定如何或在何处将它应用到我的案例中.解决方案是仅在执行程序上实例化DefaultFormats类,以避免序列化在一起吗?是否有人们正在使用scala/spark的另一个JSON解析库?我最初尝试使用jackson本身,但遇到了一些我无法轻易解决的注释错误,json4s开箱即用.这是我的代码:
import org.json4s._
import org.json4s.jackson.JsonMethods._
implicit val formats = DefaultFormats
val count = rdd.map(r => checkUa(r._2, r._1)).reduce((x, y) => x + y)
Run Code Online (Sandbox Code Playgroud)
我在checkUa函数中进行json解析.我试图让计数懒惰,希望它以某种方式延迟执行,但它没有效果.也许在checkUA中移动隐式val?任何建议都非常感谢.