2016-11-06 3 views
2
ausgeführt

ich eine Methode geschrieben, die eine Blockmatrix nimmt und setzt alle Werte, die nicht 0 bis 1.Kartenfunktion wird nie

public BlockMatrix SetNonZeroesToOnes(BlockMatrix matrix) 
{ 
    // initialize 
    JavaRDD<MatrixEntry> matrixEntries = matrix.toCoordinateMatrix().entries().toJavaRDD(); 

    // transformation 
    matrixEntries.map(t -> 
    { 
     if(t.value() != 0) 
     { 
      return new MatrixEntry(t.i(), t.j(), 1); 
     } 

     return new MatrixEntry(t.i(), t.j(), 0); 
    }); 

    // action 
    List<MatrixEntry> list = matrixEntries.collect(); 
    for (MatrixEntry matrixEntry : list) 
    { 
     System.out.println("(" + matrixEntry.i() + ", " + matrixEntry.j() + ") = " + matrixEntry.value()); 
    } 

    // return value 
    CoordinateMatrix coordMat = new CoordinateMatrix(matrixEntries.rdd(), matrix.numRows(), matrix.numCols()); 
    return coordMat.toBlockMatrix(); 
} 

Das Problem ist, dass die Kartenfunktion nie ausgeführt wird. Ich bin noch nicht dazu gekommen, die Methode mit meinem Code zu integrieren, aber für den Moment mache ich nur JUnit-Tests darauf. Der Testaufbau ist ziemlich einfach, eine Blockmatrix wird aus Daten generiert, die durch einen lokalen Funkenkontext parallelisiert und der Methode zugeführt werden.

Ich weiß über die faule Ausführung, die in Spark ist, deshalb habe ich die Collect-Methode hinzugefügt, da eine Aktion die Ausführung früherer Transformationen auslösen sollte. Beachten Sie, dass es in der endgültigen Version nicht vorhanden sein sollte, da andere Methoden Aktionen für den Datensatz ausführen.

Ich habe sogar Trace-Logs im Map-Bereich hinzugefügt und sie werden nie geloggt, der Debugger wird nicht hineintreten und natürlich wird die Funktionalität nicht ausgeführt.

Also, die Frage ist, was fehlt mir hier? Warum unterscheidet sich diese Karte -> Anruf sammeln von anderen ähnlichen?

Antwort

3

Sie ignorieren Ergebnis der matrixEntries.map(...) Aufruf, so Spark nicht einmal versuchen, ein Ergebnis zu erstellen. Wenn Sie keine Referenz auf die Originalmatrix benötigen, sollten Sie schreiben.