2017-06-05 5 views
0

Ich weiß, dass es verschiedene Möglichkeiten gibt, die Anzahl der Elemente in einem Text oder einer Liste zu zählen. Aber ich versuche zu verstehen, warum das nicht funktioniert. Ich versuche, einen gleichwertigen CodeAnzahl der Elemente in einem Text oder einer Liste mit Spark zählen

A_RDD=sc.parallelize(['a', 1.2, []]) 

acc = sc.accumulator(0) 
acc.value 
A_RDD.foreach(lambda _: acc.add(1)) 
acc.value 

zu schreiben, wo das Ergebnis 3. Dazu definierte ich die folgende Funktion aufgerufen my_count (_), aber ich weiß nicht, wie das Ergebnis zu erhalten. A_RDD.foreach (my_count) tut nichts. Ich habe auch keinen Fehler erhalten. Was habe ich falsch gemacht?

counter = 0 #function that counts elements 
def my_count(_): 
    global counter 
    counter += 1 

A_RDD.foreach(my_count) 
+0

Mary, können Sie bestätigen, ob die veröffentlichte Antwort Ihre Frage verdeutlicht? –

Antwort

1

Die Operation A_RDD.foreach(my_count) wird nicht auf Ihrer lokalen Python Virtual Machine ausgeführt. Es läuft in Ihrem Remote-Executor-Knoten. Die Laufwerke liefern daher Ihre my_count-Methode an jeden Executor-Knoten zusammen mit der Variablen counter, da die Methode die Variable referenziert. Daher erhält jeder Executor-Knoten seine eigene Definition der Variablen counter, die von der foreach-Methode aktualisiert wird, während die in Ihrer Treiberanwendung definierte Variable counter nicht inkrementiert wird.

Eine einfache, aber riskante Lösung wäre, die RDD auf Ihrem Treiber zu sammeln und dann die Anzahl wie unten zu berechnen. Dies ist riskant, da der gesamte RDD-Inhalt in den Speicher des Treibers heruntergeladen wird, was MemoryError verursachen kann.

>>> len(A_RDD.collect()) 
3 
0

Was wäre, wenn Sie lokal und nicht auf einem Cluster ausgeführt würden. In funke/scala ändert sich dieses Verhalten zwischen lokal und an einem Clust. Es hätte einen Wert, wie er lokal erwartet wird, aber im Cluster hätte er nicht den gleichen Wert, wie er beschrieben wird ... In Spark/Python passiert das Gleiche? Meine Vermutung ist es.

Verwandte Themen