2017-02-16 4 views
0

Я хотел бы представить, что для этого существуют существующие функции API. Предположим, что существует Java-код, который выглядит примерно так:Как выполнить запрос в MongoDB с помощью Apache Spark JavaRDD?

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 ключа и все его результаты в итераторе (что позволяет легко ударить по земле снова для следующих шагов, которые я намереваюсь брать). И чтобы уточнить, я имею в виду пару ключей и их результаты как итератор.

Я знаю, что в MongoDB есть функциональность, способная координировать работу с Spark, но я не нашел ничего, что с ней будет работать (похоже, оно склоняется к написанию базы данных, а не к ее запросу).

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

Обратите внимание, что есть fromJSONtoObj метод, который преобразует ваш объект обратно из JSON во все необходимые переменные поля. Также обратите внимание, что obj.getKey() - это просто метод геттера, связанный с любым «ключом».

Смежные вопросы