MongoSpark - 将bson文档转换为Map [String,Double]

时间:2018-03-20 23:13:29

标签: mongodb apache-spark spark-dataframe subdocument

在我的MongoDB数据库中,我收集了以下文档:enter image description here

可以看出,每个文档都有一些嵌套文档(Decade,Title,Plot,Genres等)。这些是我想出的SparseVectors的地图表示。实际上是用我的其他Spark工作生成的。

如图所示,这些类型的文档无法轻松读入Spark DataFrame。

我在想如何将这些文档实际读入Dataframe,其中每个子文档不是由bson Document表示,而是由简单的Map [String,Double]表示。因为每个子文档都是绝对任意的,并且包含任意数量的数字字段。

有没有办法处理这些文件?

1 个答案:

答案 0 :(得分:0)

管理解决它。方法如下:

import spark.implicits._
final case class MovieData(imdbID: Int,
                       Title: Map[Int, Double],
                       Decade: Map[Int, Double],
                       Plot: Map[Int, Double],
                       Genres: Map[Int, Double],
                       Actors: Map[Int, Double],
                       Countries: Map[Int, Double],
                       Writers: Map[Int, Double],
                       Directors: Map[Int, Double],
                       Productions: Map[Int, Double]
                      )

val movieDataDf = MongoSpark
  .load(sc, moviesDataConfig).rdd.map((doc: Document) => {
    MovieData(
      doc.get("imdbID").asInstanceOf[Int],
      documentToMap(doc.get("Title").asInstanceOf[Document]),
      documentToMap(doc.get("Decade").asInstanceOf[Document]),
      documentToMap(doc.get("Plot").asInstanceOf[Document]),
      documentToMap(doc.get("Genres").asInstanceOf[Document]),
      documentToMap(doc.get("Actors").asInstanceOf[Document]),
      documentToMap(doc.get("Countries").asInstanceOf[Document]),
      documentToMap(doc.get("Writers").asInstanceOf[Document]),
      documentToMap(doc.get("Directors").asInstanceOf[Document]),
      documentToMap(doc.get("Productions").asInstanceOf[Document])
    )
}).toDF()

def documentToMap(doc: Document): Map[Int, Double] = {
  doc.keySet().toArray.map(key => {
    (key.toString.toInt, doc.getDouble(key).toDouble)
  }).toMap
}

希望代码不言自明。某些类型的转换和转换完成了这项工作。可能不是最优雅的解决方案。