2016-06-10 61 views
3

我试图使用Stratio的Spark-MongoDB library来查询MongoDB集合。我跟着this线程上手和我目前正在运行下面的代码:使用Stratio的Spark-MongoDB库的MongoDB查询过滤器

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

这将在整个集合加载到星火数据框和收集是大的,这是一个采取了大量的时间。有什么方法可以指定查询过滤器并只将选定的数据加载到Spark中?

回答

3

Spark数据帧处理需要模式知识。在处理具有灵活和/或未知模式的数据源时,在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没有内置样本,您仍然可能访问大量数据。