Я написал метод, который принимает BlockMatrix и устанавливает все значения, отличные от 0, в 1.
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();
}
Проблема в том, что функция карты никогда не выполняется. Я еще не интегрировал этот метод в свой код, но сейчас я просто запускаю на нем тесты JUnit. Настройка теста довольно проста, BlockMatrix генерируется из данных, которые распараллеливаются локальным контекстом искры и передаются методу.
Я знаю о ленивом выполнении, присущем Spark, поэтому я добавил метод collect, так как действие должно инициировать выполнение предыдущих преобразований. Обратите внимание, что его не должно быть в окончательной версии, так как другие методы будут выполнять действия над набором данных.
Я даже добавил журналы трассировки в раздел карты, и они никогда не регистрируются, отладчик не вмешивается в это и, конечно, функциональность не выполняется.
Итак, вопрос в том, что мне здесь не хватает? Почему эта карта -> вызов вызова отличается от других подобных?