Java 8 переменная область видимости в лямбде (специфичная для Spark) - PullRequest
0 голосов
/ 06 ноября 2019

Я хотел бы заполнить карту строкой в ​​качестве ключа и строкой в ​​качестве значения, мой код:

private Map<String,Row> getMapFromDataset(Dataset<Row> dataset, List<String> mapColumns) {
    Map<String, Row> map = new HashMap<>();
    dataset.foreach((ForeachFunction<Row>) row ->
        map.put(getKey(mapColumns,row),row) //This works
    );
    return map; //Map is empty when returning!
}

Мой метод getKey () (хотя я думаю, что это не является причиной проблемы):

private String getKey(List<String> mapColumns, Row row) {
    StringBuffer sb = new StringBuffer(256);
    for(String col : mapColumns){
      sb.append((String)row.getAs(col));
    }
    return sb.toString();
}

Несмотря на то, что карта компилируется и запускается без ошибок, карта всегда пуста.
Что я заметил, так это то, что если я проверяю размер карты сразу после первой вставки,Карта имеет размер 1, поэтому вставка элементов работает, но возвращаемая карта пуста
Я также читал, что переменные, используемые в лямбда-выражениях, должны быть окончательными, это может объяснить проблему. Любой намек?

1 Ответ

1 голос
/ 06 ноября 2019

Я обнаружил, что инициализация карты происходит в драйвере, в то время как лямбды foreach отправляются исполнителям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...