Python spark:最小化对筛选器函数的调用次数

Python spark:最小化对筛选器函数的调用次数,python,mongodb,apache-spark,pyspark,rdd,Python,Mongodb,Apache Spark,Pyspark,Rdd,我有以下代码:(python) 但同样,它有很多记录。假设RDD中有10万条记录-它与集合大小相比如何?大致相同,我的主要问题是不要轰炸Mongoth Mongo Spark连接器将从SQLContext向Mongo发送过滤器,它只会将过滤后的信息传递回Spark。您还可以编写自定义聚合管道来进一步操作数据。关键是它适用于数据帧而不是原始RDD,如果您的文档包含的数据差异很大,这可能会成为一个问题。您能否提供一个代码示例?只是想澄清一下,您是否希望根据MongoDB中存在的数据过滤您现有的RDD

我有以下代码:(python)


但同样,它有很多记录。

假设RDD中有10万条记录-它与集合大小相比如何?大致相同,我的主要问题是不要轰炸Mongoth Mongo Spark连接器将从SQLContext向Mongo发送过滤器,它只会将过滤后的信息传递回Spark。您还可以编写自定义聚合管道来进一步操作数据。关键是它适用于数据帧而不是原始RDD,如果您的文档包含的数据差异很大,这可能会成为一个问题。您能否提供一个代码示例?只是想澄清一下,您是否希望根据MongoDB中存在的数据过滤您现有的RDD?或者您更愿意从MongoDB创建RDD?如果这是第一种情况,那么成本会很高,因为您需要在RDD中签入1000万个项目,MongoDB中也存在这些项目。唯一的方法是查询MongoDB—您可以在查询中使用$in来减少查询和广播变量的数量,以便共享MongoClient。然而,包含整个集合的两个RDD的连接可能是一种更有效的检查方法。这取决于两个数据源之间预期的重叠程度。假设RDD中有1000万条记录-它与集合大小相比如何?大致相同,我的主要问题是不要轰炸Mongoth Mongo Spark连接器将从SQLContext向Mongo发送过滤器,它只会将过滤后的信息传递回Spark。您还可以编写自定义聚合管道来进一步操作数据。关键是它适用于数据帧而不是原始RDD,如果您的文档包含的数据差异很大,这可能会成为一个问题。您能否提供一个代码示例?只是想澄清一下,您是否希望根据MongoDB中存在的数据过滤您现有的RDD?或者您更愿意从MongoDB创建RDD?如果这是第一种情况,那么成本会很高,因为您需要在RDD中签入1000万个项目,MongoDB中也存在这些项目。唯一的方法是查询MongoDB—您可以在查询中使用$in来减少查询和广播变量的数量,以便共享MongoClient。然而,包含整个集合的两个RDD的连接可能是一种更有效的检查方法。这取决于两个数据源之间的重叠程度。
def do_mongo_filter(record):
    from pymongo import MongoClient
    MongoClient(MONGO_URI)
    collection = MongoClient(MONGO_URI)[<db_name>][<collection_name>]
    return collection.find_one({'_id': record[0]}) is not None

rdd_after_filter = rdd_before_filter.filter(do_mongo_filter)
only_unique_keys = rdd_before_filter.keys().map(lambda x: (x,x)).reduceByKey(x,y: x)
keys_in_mongo = only_unique_keys.filter(do_mongo_filter)
rdd_after_filter = rdd_before_filter.filter(lambda x: x in keys_in_mongo.toLocalIterator())