Набор данных Spark с выходом Json выводится в кодировке Kryo - PullRequest
0 голосов
/ 07 июня 2019

Я хотел преобразовать данные CSV в определенный формат JSON, а не в обычную плоскую вещь. Поэтому я попробовал следующее:

case class CityInfo(lat : Double, long : Double)
  case class City(name: String, country: String, info : CityInfo)


    implicit def kryoEncoder[A](implicit ct: ClassTag[A]) =
      org.apache.spark.sql.Encoders.[A](ct)

    val cities = spark.read.option("header", true).csv("src/main/resources/worldcities.csv").cache()

    cities.map {
      case Row(city: String, _: Any, latStr : String, long : String, country: String, _*) =>
        City(city, country, CityInfo(latStr.toDouble, long.toDouble))
    }.write.json("data/testfile.json")

Исходя из этого, я ожидаю, что строки json будут иметь вложенный объект (например, City и CityInfo). Но я получаю строки вроде:

{ "значение": "AQBjb20uaGIuZXhlcmNpc2UuU3AxJENpdPkBAUtvc2927wEBY29tLmhiLmV4ZXJjaXNlLlNwMSRDaXR5SW5m7wFARXULDye7MEA0sJAt4A0bAVp1YmluIFBvdG / г"}

Я использовал кодер Kryo, так как он не компилировался, поэтому я нашел ответ о переполнении стека ... не уверен, что это правильно.

1 Ответ

0 голосов
/ 07 июня 2019

И я сам нашел решение слишком быстро. Так что, если вы используете spark-shell или аналогичный, вы будете иметь все последствия, и ничего особенного не требуется. Но если, как и я, вы пишете Scala-приложение с нуля, вам нужно добавить:

import spark.implicits._

это добавит неявные кодеры. Также удалите вещь Kryo. Примечание: приведенный выше пример не будет работать, пока (в CityInfo) генерируется ошибка зарезервированного слова.

...