2016-06-10 41 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沒有內置樣本,您仍然可能訪問大量數據。