[英]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.