具有Json输出的Spark数据集以Kryo编码形式出现

时间:2019-06-07 15:32:08

标签: apache-spark apache-spark-dataset

我想将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")

由此,我期望带有嵌套对象(如City和CityInfo)的json行。但我得到这样的行:

{“值”:“ AQBjb20uaGIuZXhlcmNpc2UuU3AxJENpdPkBAUtvc2927wEBY29tLmhiLmV4ZXJjaXNlLlNwMSRDaXR5SW5m7wFARXULDye7MEA0sJAt4A0bAVp1d>}

我使用Kryo编码器,因为它无法编译,所以我找到了关于它的堆栈溢出答案...不确定这是正确的事情。

1 个答案:

答案 0 :(得分:0)

我自己找到解决方案的速度太快了。 因此,如果您使用的是spark-shell或类似程序,则将包含所有隐式内容,并且不需要任何特殊的内容。但是,如果像我一样,您是从头开始编写scala应用程序,则需要添加:

let myFunc = (x, y) => {
  let myArray = [];
  for (let i = x; i <= y; i++) {
    myArray.push(i);
  }
  return myArray;
}

let anArray = myFunc(1, 10);
console.log(anArray.slice(1, -1));

这将添加隐式编码器。同时删除Kryo物件。 注意:只要(在CityInfo中)上面的示例作为保留字会产生错误,就不会起作用。