2017-02-16 5 views
0

これには既存のAPI機能があると思います。このようになりますJavaコードがあったとします。このApache Spark JavaRDDを使用してMongoDBでどのようにクエリを実行しますか?

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 = ...; 

は目標:データ変換の束の後、私は私が持つ単一のDBクエリをしたいのですが整数キーのRDDで終わります(一連のクエリではなく)このキーのコレクションに基づいています。

そこから、クエリ結果をキーのRDDとイテレータのすべての結果のペアに変換したいと思います(次のステップのために再び地面に向かうことが容易になります)取る)。そして明確にするために、私はイテレータとしてキーとその結果のペアを意味します。

私はSparkとコーディネートできるMongoDBの機能があることは知っていますが、まだこれで動作するものは見つかりませんでした。(クエリではなくデータベースに書き込む傾向があります)

+0

RDDをマッピングしてMongoDBをクエリすることができます –

+0

ええ、それはかなり普通です。 –

答えて

0

私は効率的な方法でこれを把握することができました。

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); 
} 

注必須フィールド変数のすべてに戻ってJSONから、あなたのオブジェクトに変換しますfromJSONtoObj方法があること。また、obj.getKey()は単にそれが "キー"であることに関連するゲッターメソッドです。

関連する問題