簡體   English   中英

如何使用Apache Spark JavaRDD在MongoDB中進行查詢?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM