我有一个实例的嵌套JSON格式
{
"id": 5,
"obj": {
"x": 5
}
}
我想将其解释为(Int, Map[String, AnyRef])
,甚至更好地解释为
case class MyRow(id: Int, obj: Map[String, AnyRef])
我敢打赌,这可以在Spark中轻松实现,但我觉得自己不够强大,无法自行解决。尝试通过.as[T]
读取文件来使用DataFrame
的{{1}}方法。不幸的是,地图被解释为嵌套结构,并且出现运行时错误。
spark.read.json
说明:df.as[(Int, Map[String, AnyRef])] // this throws runtime exception
中的属性数量当然有所变化。
答案 0 :(得分:1)
好,我明白了。我会自行回答。
首先,as[(Int, Map[String, AnyRef])]
无效,因为这种格式不是元组-有点像地图。
不幸的是,我没有使用MyRow
,因为我在使用它的方法中声明了这个case类。 Scala无法为其推断编码器。那就是:
def run (spark: SparkSession): Unit = {
import spark.implicits._
case class MyRow(id: Int, obj: Map[String, AnyRef])
val frame = spark.read.json("...").as[MyRow]
// ...
无法编译,但
case class MyRow(id: Int, obj: Map[String, AnyRef])
def run (spark: SparkSession): Unit = {
import spark.implicits._
val frame = spark.read.json("...").as[MyRow]
// ...
按预期工作。