[英]How do I query in MongoDB with Apache Spark JavaRDDs?
我想想象一下已有針對此的API功能。 假設有看起來像這樣的Java代碼:
JavaRDD<Integer> queryKeys = ...; //values not particularly important
List<Document> allMatches = db.getCollection("someDB").find(queryKeys); //doesn't work, I'm aware
JavaPairRDD<Integer, Iterator<ObjectContainingKey>> dbQueryResults = ...;
這樣做的目標:經過一堆數據轉換后,我得到了一個整數鍵的RDD,我希望基於該鍵集合使用單個db查詢(而不是一堆查詢)來進行數據庫查詢。
從那里,我想將查詢結果轉換為鍵的RDD對,並將其所有結果轉換為一個迭代器(這使我很容易再次着手進行下一步我打算采取的步驟)。 為了澄清,我的意思是一對密鑰及其結果作為迭代器。
我知道MongoDB中有能夠與Spark協調的功能,但是我還沒有找到任何可以與之配合的功能(它似乎傾向於寫入數據庫而不是查詢數據庫)。
我設法以足夠有效的方式解決了這個問題。
JavaRDD<Integer> queryKeys = ...;
JavaRDD<BasicDBObject> queries = queryKeys.map(value -> new BasicDBObject("keyName", value));
BasicDBObject orQuery = SomeHelperClass.buildOrQuery(queries.collect());
List<Document> queryResults = db.getCollection("docs").find(orQuery).into(new ArrayList<>());
JavaRDD<Document> parallelResults = sparkContext.parallelize(queryResults);
JavaRDD<ObjectContainingKey> results = parallelResults.map(doc -> SomeHelperClass.fromJSONtoObj(doc));
JavaPairRDD<Integer, Iterable<ObjectContainingKey>> keyResults = results.groupBy(obj -> obj.getKey());
以及方法buildOrQuery
在這里:
public static BasicDBObject buildOrQuery(List<BasicDBObject> queries) {
BasicDBList or = new BasicDBList();
for(BasicDBObject query : queries) {
or.add(query);
}
return new BasicDBObject("$or", or);
}
請注意,有一個fromJSONtoObj
方法可以將您的對象從JSON轉換回所有必需的字段變量。 還要注意, obj.getKey()
只是與它所關聯的任何“鍵”相關的getter方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.