Сохраните JsObject в JSON-файл (java.lang.String не может быть преобразован в scala.scalajs.js.Any). - PullRequest
0 голосов
/ 23 декабря 2018

Я использую игровую инфраструктуру для создания объекта json, после этого я должен сохранить эти объекты в файле json.linksEvolution - это последовательность объектов JsObject.

  var linksEvolution: Seq[JsObject] = Seq()

a JsObject создается путем:

    val user = Json.obj(
        "link" -> [87, 98],
        "reference" -> [1,8],
    )

обновления списка JsObject:

    val tmplinksEvolution = linksEvolution :+ user

    linksEvolution = tmplinksEvolution

При обновлениииз linksEvolution завершена, теперь я создаю RDD с помощью linksEvolution, поэтому каждый элемент 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

Это исключение возникает только тогда, когда я использую файл jar, предоставленный maven install.Но когда тот же код работает нормально, когда я запускаю его с помощью 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>

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Наконец решение найдено здесь (решение 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)
}

Имея строку, я создал СДР из этих строк.После этого я сохранил строки с помощью saveAsTextFile ().

0 голосов
/ 23 декабря 2018

Я попробовал пример, который вы упомянули, и он отлично работает со мной.

единственная разница заключается в определении объекта пользователя:

  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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...