2017-06-19 2 views
0

Ich brauche eine Funktion auf RDD, sagen wir "isAllMatched", die ein Prädikat als ein passendes Argument nehmen wird. Allerdings, Ich möchte nicht alle Elemente überprüfen, wenn Prädikat für ein Element fehlschlägt, sollte es false zurückgeben. Ich möchte auch, dass diese Funktion parallel auf allen Arbeiterknoten ausgeführt wird. Hier ist der Pseudocode:Benötigen Sie eine spezielle Funktion in Spark, die prüft, ob alle Elemente mit dem gegebenen Prädikat übereinstimmen oder nicht?

def isAllMatched[T : ClassTag](rdd: RDD[T])(pred: T => Boolean) = { 
     foreach(ele <- rdd.elements) { 
      if(!pred(ele)) return false; 
     } 
     return true; 
} 

Ist dies in Spark möglich? Gibt es eine eingebaute Funktion, um das zu tun?

Antwort

0

Ich weiß nicht, RDD Betrieb vorhandenen dieses Ergebnis zu erreichen, aber Sie können Ihre Funktion wie folgt implementieren:

def isAllMatched[T](rdd: RDD[T])(pred: T => Boolean): Boolean = 
    rdd.filter(e => !pred(e)).isEmpty 
+0

Ja, aber dies wird alle Elemente scannen. Ich möchte die Ausführung unterbrechen, sobald das Prädikat fehlschlägt. – aks

-1

Piotr Antwort richtig ist. Es macht genau das, wonach du gefragt hast. Lazy Evaluation stellt sicher, dass der Scan sofort stoppt, wenn das erste Element den Prädikat-Test nicht besteht und ein Boolean-False an den Treiber zurückgegeben wird. Alle Aufgaben, die auf den anderen Knoten der gleichen Operation ausgeführt werden, werden aufgegeben.

Verwandte Themen