[英]Save a JsObject to JSON file (java.lang.String cannot be cast to scala.scalajs.js.Any)
我正在使用play框架創建一個json對象,之后,我應該將這些對象保存在json文件中。 linksEvolution是JsObject對象的序列。
var linksEvolution: Seq[JsObject] = Seq()
一個JsObject由創建:
val user = Json.obj(
"link" -> [87, 98],
"reference" -> [1,8],
)
更新JsObject的列表:
val tmplinksEvolution = linksEvolution :+ user
linksEvolution = tmplinksEvolution
完成linksEvolution的更新后,現在我通過linksEvolution創建一個RDD,因此RDD中的每個元素都將保存在一個文件中,例如:
//create the RDD
val rddLinksEvolution = spark.sparkContext.parallelize(linksEvolution)
//convert each JsObject to string
val tmprddLinksEvolution = rddLinksEvolution.map(_.toString())
//save the data on a text file
tmprddLinksEvolution.saveAsTextFile("testSavingFile_2.json")
問題:出現錯誤:
java.lang.ClassCastException: java.lang.String cannot be cast to scala.scalajs.js.Any
僅當我使用maven install給定的jar文件時,才會引發此異常。 但是,當我使用Scala IDE(運行scala應用程序)運行相同的代碼時,它運行正常!
編輯:主要功能和依賴項中的示例
完整示例:
import play.api.libs.json.{ JsArray, JsNumber, JsObject, Json }
import org.apache.spark.{ SparkConf, SparkContext }
object TestJson {
def main(args: Array[String]) = {
var linksEvolution: Seq[JsObject] = Seq()
val user = Json.obj(
"link" -> JsArray(Seq(JsNumber(87), JsNumber(98))),
"reference" -> JsArray(Seq(JsNumber(1), JsNumber(8))))
val tmplinksEvolution = linksEvolution :+ user
linksEvolution = tmplinksEvolution
val sc = new SparkContext(new SparkConf().setAppName("test").setMaster("local"))
//create the RDD
val rddLinksEvolution = sc.parallelize(linksEvolution)
//convert each JsObject to string
val tmprddLinksEvolution = rddLinksEvolution.map(_.toString())
//save the data on a text file
tmprddLinksEvolution.saveAsTextFile("testSavingFile_kk2.json")
}
}
具有依賴項:
<dependencies>
<!-- https://mvnrepository.com/artifact/com.typesafe.play/play-json -->
<dependency>
<groupId>com.typesafe.play</groupId>
<artifactId>play-json_sjs0.6_2.11</artifactId>
<version>2.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.0</version>
</dependency>
我嘗試了您提到的示例,它對我來說很好用。
唯一的區別是定義了用戶對象:
val user = Json.obj(
"link" -> JsArray(Seq(JsNumber(87), JsNumber(98))),
"reference" -> JsArray(Seq(JsNumber(1), JsNumber(8)))
)
您還應該注意,輸出將是目錄而不是文本文件。 因此,您將找到一個名為“ testSavingFile_2.json”的目錄,並且在此目錄下將找到多個名為“ part-00000”,“ part-00001”,...的文件。
另外,我不確定您使用什么導入,但是這些是我使用的導入:
import play.api.libs.json.{ JsArray, JsNumber, JsObject, Json }
最后在這里找到解決方案(Lift-JSON解決方案)。
import scala.collection.mutable._
import net.liftweb.json._
import net.liftweb.json.Serialization.write
case class Person(name: String, address: Address)
case class Address(city: String, state: String)
object LiftJsonTest extends App {
val p = Person("Alvin Alexander", Address("Talkeetna", "AK"))
// create a JSON string from the Person, then print it
implicit val formats = DefaultFormats
val jsonString = write(p)
println(jsonString)
}
通過使用字符串,我創建了這些字符串的RDD。 之后,我使用saveAsTextFile()保存了字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.