2016-03-28 6 views
0

Ich versuche zu verstehen, derzeit, wie RDD funktioniert. Zum Beispiel möchte ich die Zeilen basierend auf dem Kontext in einem RDD-Objekt zählen. Ich habe einige experince mit Datenrahmen und meinen Code für DF, die A beispielsweise Spalten, B und wahrscheinlich einige andere Spalten, sucht wie:zählen Sie die Zeilen in RDD abhängig von den Linien Kontext, pyspark

df = sqlContext.read.json("filepath") 
df2 = df.groupBy(['A', 'B']).count() 

Der logische Teil dieses Codes ist für mich klar - ich tun groupBy Operation über Spaltenname in DF. In RDD habe ich keinen Spaltennamen, nur ähnliche Zeilen, die ein Tupel oder ein Zeilenobjekt sein könnten ... Wie kann ich ähnliche Tupel zählen und sie als Integer zur eindeutigen Zeile hinzufügen? Zum Beispiel meines erster Code:

df = sqlContext.read.json("filepath") 
rddob = df.rdd.map(lambda line:(line.A, line.B)) 

ich die Karte Operation tun und ein Tupel der Werte aus den Tasten A und B erstellen. Die eindeutige Zeile hat keine Schlüssel mehr (dies ist der wichtigste Unterschied zum DataFrame, der den Spaltennamen hat). Jetzt kann ich so etwas produzieren, aber es berechnet nur eine Gesamtanzahl von Zeilen in RDD.

rddcalc = rddob.distinct().count() 

Was ich für meine Ausgabe wollen, ist nur:

((a1, b1), 2) 
((a2, b2), 3) 
((a2, b3), 1) 
... 

PS

ich meine persönliche Lösung für diese Frage gefunden zu haben. Hier: rdd ist initial rdd, rddlist ist eine Liste aller Zeilen, rddmod ist eine final modifizierte rdd und folglich die Lösung.

rddlist = rdd.map(lambda line:(line.A, line.B)).map(lambda line: (line, 1)).countByKey().items() 
rddmod = sc.parallelize(rddlist) 
+0

In der Tat wird 'groupBy' nicht empfohlen, da das Mischen der Partitionen erforderlich ist, wodurch viele Daten zwischen allen Knoten verschoben werden. –

+0

@ Alberto Bonsanto, vielen Dank für das Interesse an diesem Thema. Ich denke nicht, dass groupBy für DF gefährlich ist und für RDD existiert es nicht. – Guforu

+0

Nun können Sie einige Gründe finden, die von * Databricks * hier erklärt werden [Prefer reduceByKey über groupByKey] (https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html) –

Antwort

1

Ich glaube, was Sie hier suchen, ist ein reduceByKey. Dies gibt Ihnen eine Zählung, wie oft jedes unterschiedliche Paar von (a,b) Zeilen erscheint. Es würde wie folgt aussehen:

rddob = df.rdd.map(lambda line: (line.A + line.B, 1)) 
counts_by_key = rddob.reduceByKey(lambda a,b: a+b) 

Sie jetzt Schlüssel haben, Wertepaare der Form: ((a,b), count-of-times-pair-appears)

Bitte beachten Sie, dass dies nur funktioniert, wenn A und B Strings sind. Wenn es sich um Listen handelt, müssen Sie einen Objekttyp "Primärschlüssel" erstellen, um die Reduzierung durchzuführen. Sie können reduceByKey nicht ausführen, wo der Primärschlüssel ein kompliziertes Objekt ist.

+0

danke für Ihre Antwort. Eigentlich habe ich schon die Lösung gefunden, habe sie aber hier nicht veröffentlicht. Sie haben fast Recht, ich habe die Schlüssel als einzigartige Kombination von (A- und B-Werte, aber verwendet CountByKey als letzte Funktion. Vielen Dank trotzdem – Guforu

+0

Sie sollten Ihre Lösung veröffentlichen, so dass andere Leute es verwenden können. – PinoSan

+0

@PinoSan, ok, ich habe meinen ersten Beitrag aktualisiert – Guforu