2016-06-10 8 views
3

Я пытаюсь запросить коллекцию MongoDB, используя Spark-MongoDB от Stratio library. Я последовал за this нити, чтобы начать с, и я в настоящее время работаю следующий фрагмент кода:Фильтры запросов MongoDB с использованием библиотеки Spark-MongoDB от Stratio

reader = sqlContext.read.format("com.stratio.datasource.mongodb") 
data = reader.options(host='<ip>:27017', database='<db>', collection='<col>').load() 

Это загрузит всю коллекцию в Спарке dataframe и как коллекция велика, это отнимающее много времени , Есть ли способ указать фильтры запросов и загрузить только выбранные данные в Spark?

ответ

3

Обработка данных для обработки искр требует знания схемы. При работе с источниками данных с гибкой и/или неизвестной схемой, прежде чем Spark сможет что-либо сделать с данными, он должен открыть свою схему. Это то, что делает load(). Он рассматривает данные только с целью обнаружения схемы data. Когда вы выполняете действие на data, например, collect(), Spark фактически прочитает данные для целей обработки.

Существует только один способ радикально ускорить load(), и это путем предоставления схемы самостоятельно и, таким образом, устранения необходимости обнаружения схемы. Вот пример, взятый из the library documentation:

import org.apache.spark.sql.types._ 
val schemaMongo = StructType(StructField("name", StringType, true) :: StructField("age", IntegerType, true) :: Nil) 
val df = sqlContext.read.schema(schemaMongo).format("com.stratio.datasource.mongodb").options(Map("host" -> "localhost:27017", "database" -> "highschool", "collection" -> "students")).load 

Вы можете получить небольшой выигрыш путем отбора проб лишь часть документов в коллекции, установив параметр schema_samplingRatio конфигурации на значение меньше 1.0 по умолчанию. Однако, поскольку у Mongo нет встроенной выборки, вы все равно будете получать доступ к потенциально большому количеству данных.