2017-01-03 5 views
2

Ich benutze spark 2.0, um die Daten von Parkett-Datei zu lesen.reduebykey und aggregatebykey in funken Dataframe

val Df = sqlContext.read.parquet("c:/data/parquet1") 
val dfSelect= Df. 
     select(
     "id", 
     "Currency", 
     "balance" 

    ) 



val dfSumForeachId=dfSelect.groupBy("id").sum("balance") 
val total=dfSumForeachId.agg(sum("sum(balance)")).first().getDouble(0) 

Um einen Gesamtbilanzwert zu erhalten, ist dies der beste Weg, um es mit einer Aktion zuerst() auf einem Datenrahmen zu bekommen?

In spark 2.0 ist es in Ordnung, groupby key zu verwenden, hat es das gleiche Leistungsproblem wie groupbykey auf rdd wie es die gesamten Daten über das Netzwerk mischen und Aggregation durchführen oder die Aggregation lokal wie reduebykey durchgeführt wird in früheren Version des Funkens

Dank

Antwort

3

die Daten bekommen, indem Sie zunächst eine absolut gültige Möglichkeit, die Daten zu bekommen. Das heißt, tun:

val total = dfSelect.agg(sum("balance")).first().getDouble(0) 

würde Ihnen wahrscheinlich eine bessere Leistung für die Gesamt erhalten.

Gruppe von Schlüssel und reduzieren durch Schlüssel arbeiten genau das gleiche wie frühere Versionen aus den gleichen Gründen. Gruppe für Schlüssel macht keine Annahmen über die Aktion, die Sie ausführen möchten, und kann daher nicht wissen, wie partielle Aggregationen durchgeführt werden, wie es durch Schlüssel reduziert wird.

Wenn Sie Dataframe groupby und sum tun, tun Sie tatsächlich reduzieren durch Schlüssel mit der Option + und die zweite Aggregation, die Sie taten, ist eine Reduzierung mit dem +. Dieser Datenrahmen macht es effizienter, weil er, wenn er genau weiß, was getan wird, viele Optimierungen durchführen kann, wie zum Beispiel die Erzeugung von Code in der gesamten Stufe.

+0

danke für die Erklärung – baiduXiu

Verwandte Themen