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?