繁体   English   中英

Scala Spark Mongo - 带有“in”子句的过滤器

[英]Scala Spark Mongo - filter with “in” clause

我有一个可能相当大的 mongoDB 集合。

我正在使用以下连接器来使用 spark 从该集合中读取数据:

        <dependency>
            <groupId>org.mongodb.spark</groupId>
            <artifactId>mongo-spark-connector_2.11</artifactId>
            <version>2.4.2</version>
        </dependency>

我想通过一个封闭的 id 列表(也可能很长)过滤集合,该列表是从另一个数据源获取的。

我从文档中了解到,可以将一些过滤下推以在 mongo 端发生。

例如

rdd.filter(doc => doc.getInteger("test") > 5)

我想知道是否有办法执行类似于:

val ids = spark.sql("select ids from some_non_mongo_table")
val mongoDocs = MongoSpark.load(spark.sparkContext, mongoConf)
                          .filter(doc => doc.id in ids)

如果不可能,除了从 mongo 获取整个集合并将结果与 ids dataframe 连接之外,还有其他合理的解决方案吗?

你可以使用.filter(doc => ids.contain(doc.id))吗?

val ids = spark.sql("select ids from some_non_mongo_table").collect.map(r => r(0))

val mongoDocs = MongoSpark.load(spark.sparkContext, mongoConf)
                          .filter(doc => ids.contains(doc.id))

最后,我将过滤值作为管道发送。 看起来更可取,因为无法以其他方式将过滤器推下,并且获取整个集合太重了。

    // ids is a comma delimited string 
    val pipeline = "{$match: {id : {$in:[" + ids + "]}}}"
    val mongoConf = mongoReadConfig


    val existingSnapshots = MongoSpark
      .load(spark.sparkContext, mongoConf)
      .withPipeline(Seq(Document.parse(pipeline)))
      .toDF()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM