【问题标题】:MongoSpark - convert bson Document to Map[String, Double]MongoSpark - 将 bson 文档转换为地图 [字符串,双精度]
【发布时间】:2018-08-29 22:35:06
【问题描述】:

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

可以看到,每个文档都有一些嵌套文档(Decade、Title、Plot、Genres 等)。这些是我想出的 SparseVectors 的 Map 表示。并且实际上是由我的其他 Spark 作业生成的。

从表面上看,这类文档不容易读入 Spark DataFrame。

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

有没有办法处理这样的文件?

【问题讨论】:

    标签: mongodb apache-spark spark-dataframe subdocument


    【解决方案1】:

    设法解决它。方法如下:

    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
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多