如何在Spark中读取数据集中的Map

时间:2018-08-01 21:02:06

标签: scala apache-spark

我有一个实例的嵌套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 中的属性数量当然有所变化。

1 个答案:

答案 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]
// ...

按预期工作。