2017-06-06 4 views
0

Wenn ich eine Tabelle mit PySparkFunktioniert Spark Datarame die Transformationen gegen DB?

df1 = session.read.jdbc(url=self.url, 
         table=self.table, 
         properties={"driver": self.driver, 
            "user": self.user, 
            "password": self.password}) 

oder

df1 = sql.read.format("com.databricks.spark.redshift") 
       .options(url=self.url, 
         query=self.table, 
         user=self.user, 
         password=self.password, 
         tempdir="s3://path/data/").load() 

und dann wende ich einige Transformationen wie Joins und groupBy

df3 = df1.join(df2, df1.id == df2.id) 
df_res = df3.groupBy("id").agg({'tax': 'sum'}) 

, dass gegen die DB erfolgt? Wenn ja, wie kann man das im Speicher machen?

Antwort

2

Es ist nicht. Während Spark einfache Projektionen und Selektionen unterdrücken kann (Details hängen von einer bestimmten Datenquellenimplementierung ab), wendet es keine starke Verarbeitung für die Datenbank an, es sei denn, es wird explizit in einer unterstützten Datenquelle angewiesen.

Zum Beispiel mit jdbc Sie subquery als table Argument übergeben, und mit com.databricks.spark.redshift können Sie query Option verwenden.

Mit dem ersten Schnipsel (jdbc) Funken werden alle erforderlichen Daten gelesen werden (nach einer möglichen Projektionen und Selektionen Anwendung) a single executor verwenden, in dem zweiten Code-Schnipsel, das Ergebnis der anfänglichen query (plus Vorsprünge und Selektionen) bis S3 und gelesen von dort parallel. In beiden Fällen sollte Spark in der Lage sein, die Projektion (id, tax) herunterzudrücken.

Danach wird Spark Daten lokal im Cluster verarbeiten, dazu gehören join und Aggregation.

Verwandte Themen