Spark&x2B;Json4s序列化问题
我在Spark 2.2.0闭包中使用Json4s类。序列化Spark&x2B;Json4s序列化问题,json,apache-spark,serialization,json4s,Json,Apache Spark,Serialization,Json4s,我在Spark 2.2.0闭包中使用Json4s类。序列化DefaultFormats失败的“解决办法”是包含需要它们的定义。我相信我在下面做了比我需要做的更多的事情,但仍然会遇到序列化失败 使用Spark 2.2.0、Scala 2.11、Json4s 3.2.x(Spark中的任何内容),并通过使用sbt将Json4s 3.5.3引入到我的工作中来尝试使用它。在所有情况下,我都使用了如下所示的解决方法 有人知道我做错了什么吗 logger.info(s"Creating an RDD for
DefaultFormats
失败的“解决办法”是包含需要它们的定义。我相信我在下面做了比我需要做的更多的事情,但仍然会遇到序列化失败
使用Spark 2.2.0、Scala 2.11、Json4s 3.2.x(Spark中的任何内容),并通过使用sbt将Json4s 3.5.3引入到我的工作中来尝试使用它。在所有情况下,我都使用了如下所示的解决方法
有人知道我做错了什么吗
logger.info(s"Creating an RDD for $actionName")
implicit val formats = DefaultFormats
val itemProps = df.rdd.map[(ItemID, ItemProps)](row => { <--- error points to this line
implicit val formats = DefaultFormats
val itemId = row.getString(0)
val correlators = row.getSeq[String](1).toList
(itemId, Map(actionName -> JArray(correlators.map { t =>
implicit val formats = DefaultFormats
JsonAST.JString(t)
})))
})
我还有一个例子。你可以用spark shell试试。我希望它能帮助你
import org.json4s._
import org.json4s.jackson.JsonMethods._
def getValue(x: String): (Int, String) = {
implicit val formats: DefaultFormats.type = DefaultFormats
val obj = parse(x).asInstanceOf[JObject]
val id = (obj \ "id").extract[Int]
val name = (obj \ "name").extract[String]
(id, name)
}
val rdd = sc.parallelize(Array("{\"id\":0, \"name\":\"g\"}", "{\"id\":1, \"name\":\"u\"}", "{\"id\":2, \"name\":\"c\"}", "{\"id\":3, \"name\":\"h\"}", "{\"id\":4, \"name\":\"a\"}", "{\"id\":5, \"name\":\"0\"}"))
rdd.map(x => getValue(x)).collect
有趣。一个典型的问题是,您会遇到
隐式val格式的序列化问题,但当您在循环中定义它们时,这应该是正常的
我知道这有点骇人,但您可以尝试以下方法:
使用@transient implicit val
可能需要做一个最小的测试JsonAST.JString(t)
是否可序列化
你能解决它吗?我认为应该在map函数中创建json4s实例。json实例可能在驱动程序节点中创建,但在执行器节点中执行。
import org.json4s._
import org.json4s.jackson.JsonMethods._
def getValue(x: String): (Int, String) = {
implicit val formats: DefaultFormats.type = DefaultFormats
val obj = parse(x).asInstanceOf[JObject]
val id = (obj \ "id").extract[Int]
val name = (obj \ "name").extract[String]
(id, name)
}
val rdd = sc.parallelize(Array("{\"id\":0, \"name\":\"g\"}", "{\"id\":1, \"name\":\"u\"}", "{\"id\":2, \"name\":\"c\"}", "{\"id\":3, \"name\":\"h\"}", "{\"id\":4, \"name\":\"a\"}", "{\"id\":5, \"name\":\"0\"}"))
rdd.map(x => getValue(x)).collect