【问题标题】:Spark Scala flatMap over bson document with subdocument from MongoSpark Scala flatMap over bson 文档和来自 Mongo 的子文档
【发布时间】:2017-06-26 16:56:18
【问题描述】:

我是 Spark 和 Scala 的新手。我有一个 Mongo 集合,其中包含这样的文档:

{
    "_id": "doc_1",
    "posts": {
        "a": { "total": 1 },
        "b": { "total": 2 }
    }
}

我正在像这样将它加载到 Spark RDD 中

val rc = ReadConfig(Map("collection" -> "my_collection"), Some(ReadConfig(sparkSession)))
val rdd = MongoSpark.load(sparkContext, rc)

我想使用flatMap(或其他合适的函数)将帖子子文档展平成一个新的RDD,如下所示:

|--------|---------|-------|
| doc_id | post_id | total |
|--------|---------|-------|
| doc_1  | a       | 1     |
| doc_1  | b       | 2     |
| doc_2  | ...     | ...   |
|--------|---------|-------|

(我使用的是 RDD 而不是 DataFrame,因为文档很大,而且似乎使用的内存更少)。

flatMap 的签名是flatMap[U](f: (T) => TraversableOnce[U])(implicit arg0: ClassTag[U]): RDD[U]。 RDD 中的每个对象都是来自 Mongo 连接器的 org.bson.Document,所以我想写如下内容:

val newRdd = rdd.flatMap( { x: org.bson.Document => { x.posts }})

但这给出了:

值的帖子不是 org.bson.Document 的成员

我做了很多谷歌搜索。似乎这应该很简单,但我无法弄清楚。你能指出我正确的方向吗?

【问题讨论】:

  • 你尝试过爆炸功能吗?

标签: mongodb scala apache-spark


【解决方案1】:

这不是 JavaScript :) 你必须只使用类中的字段;不允许使用 JavaScript 表示法。

如我所见,Document 有函数get,你可以使用它:

case class Post (///...
val newRdd = rdd.flatMap( { x: org.bson.Document => { x.get("posts", Post)// do something }})

你应该在哪里而不是// do something 发布你的转换。

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2011-06-15
    • 2011-09-26
    • 2017-06-05
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多