【发布时间】:2016-05-19 18:18:07
【问题描述】:
虽然
import play.api.libs.json._
case class Person(name: String, lovesPandas: Boolean)
implicit val personFormat = Json.format[Person]
val text = """{"name":"Sparky The Bear", "lovesPandas":true}"""
val jsonParse = Json.parse(text)
val result = Json.fromJson[Person](jsonParse)
result.get
在带有 Apache Toree 内核的 Jupyter notebook 上工作,
import org.apache.spark._
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class Person(name: String, lovesPandas: Boolean)
implicit val personReads = Json.format[Person]
val text = """{"name":"Sparky The Bear", "lovesPandas":true}"""
val input = sc.parallelize(List(text))
val parsed = input.map(Json.parse(_))
val result = parsed.flatMap(record => {
personReads.reads(record).asOpt
})
result.filter(_.lovesPandas).map(Json.toJson(_)).saveAsTextFile("files/out/pandainfo.json")
返回
Name: org.apache.spark.SparkException
Message: Task not serializable
StackTrace: org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:304)
[...]
我知道传递给其他节点的对象需要序列化,这似乎是不可能的。那么这个例子有问题还是我做错了什么?我该如何解决这个问题?
顺便说一句
import org.apache.spark._
import play.api.libs.json._
import play.api.libs.functional.syntax._
val text = """{"name":"Sparky The Bear", "lovesPandas":true}"""
case class Person(name: String, lovesPandas: Boolean)
val input = sc.parallelize(List(text))
val parsed = input.map(Json.parse(_))
val result = parsed.flatMap(record => {
implicit val personReads = Json.format[Person]
personReads.reads(record).asOpt
})
result.collect
会导致
Name: org.apache.spark.SparkException
Message: Job aborted due to stage failure: Task 3.0 in stage 0.0 (TID 3) had a not serializable result: play.api.libs.json.OFormat$$anon$1
Serialization stack:
- object not serializable (class: play.api.libs.json.OFormat$$anon$1, value:
[...]
我用result.collect来测试这部分代码是否正确。
另外,如果我写的话
result. filter(_.lovesPandas).map{Json.toJson(_)}.saveAsTextFile("files/out/pandainfo.json")
我得到的不是result.collect
Name: Compile Error
Message: <console>:166: error: No Json serializer found for type Person. Try to implement an implicit Writes or Format for this type.
Json.toJson(_)
^
StackTrace:
所以我想必须将Person 声明为Serializable。但是,在最后添加extends Serializable 没有效果,而with Serializable 会抛出错误
Name: Compile Error
Message: <console>:2: error: ';' expected but 'with' found.
case class Person(name: String, lovesPandas: Boolean) with Serializable
^
【问题讨论】:
-
with用于扩展多个特征......你需要extends Serializable -
我不确定 Spark 的可序列化与 Java 的可序列化有什么关系,因此仅添加“扩展可序列化”不会有任何作用。此外,您引用的示例页面上的确切代码是否适合您? (即没有您的任何更改)?
-
@TheArchetypalPaul Spark 没有自己的 Serializable 属性。它在运行 CloserCleaner 时查找 Java 可序列化。
-
好的,但无论如何,只是在最后添加一个“扩展可序列化”并不能解决任何问题。我想知道未修改的示例是否适用于 OP....
-
案例类自动实现
Serializable,无需扩展。
标签: json scala apache-spark jupyter-notebook apache-toree