Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark&x2B;Json4s序列化问题_Json_Apache Spark_Serialization_Json4s - Fatal编程技术网

Spark&x2B;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

我在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 $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