2016-06-10 12 views
3

Ich versuche, eine MongoDB-Sammlung mit der Spark-MongoDB von Stratio library abzufragen. Ich folgte this Thread zu beginnen mit und ich bin zur Zeit das folgende Stück Code ausgeführt wird:MongoDB-Abfragefilter mit der Spark-MongoDB-Bibliothek von Stratio

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

Dies wird die gesamte Kollektion in Spark-Datenframe laden und als die Sammlung groß ist, ist es eine sehr viel Zeit nehmen . Gibt es eine Möglichkeit, Abfragefilter anzugeben und nur ausgewählte Daten in Spark zu laden?

Antwort

3

Die Spark-Datenframeverarbeitung erfordert Schemawissen. Beim Arbeiten mit Datenquellen mit flexiblem und/oder unbekanntem Schema, bevor Spark mit den Daten etwas anfangen kann, muss es sein Schema erkennen. Dies ist, was load() tut. Es betrachtet die Daten nur zu dem Zweck, das Schema von data zu ermitteln. Wenn Sie eine Aktion auf data ausführen, z. B. collect(), wird Spark tatsächlich die Daten für Verarbeitungszwecke lesen.

Es gibt nur eine Möglichkeit, load() radikal zu beschleunigen, und zwar indem Sie das Schema selbst bereitstellen und somit die Notwendigkeit einer Schemaerkennung umgehen. Hier ist ein Beispiel aus 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 

Sie können eine leichte Verstärkung erhalten durch Abtasten nur einen Bruchteil der Dokumente in der Sammlung durch Einstellen der schema_samplingRatio Konfigurationsparameter auf einen Wert kleiner als der 1.0 Standard. Da Mongo jedoch keine integrierten Stichproben enthält, können Sie immer noch auf eine Vielzahl von Daten zugreifen.

Verwandte Themen