使用Stratio的Spark-MongoDB库的MongoDB查询过滤器

时间:2016-06-10 23:31:38

标签: mongodb apache-spark pyspark apache-spark-sql stratio

我尝试使用Stratio的Spark-MongoDB library来查询MongoDB集合。我按照this主题开始使用,我目前正在运行以下代码:

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

这会将整个集合加载到Spark数据框中,并且由于集合很大,所以需要花费很多时间。有没有办法指定查询过滤器并只将选定的数据加载到Spark?

1 个答案:

答案 0 :(得分: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没有内置采样,您仍然可能会访问大量数据。