Apache Spark JavaRDD группирует по 2 полям и получает сумму третьего поля для объекта нестандартного типа - PullRequest
0 голосов
/ 26 сентября 2018

Я использую Java 8 для своей искровой работы.

У меня есть класс ниже, который мне нужно обработать:

public class MyModel implements Serializable {

  private String region;

  private String keyword;

  private Long termFrequency;

}

Я применил обработку ниже:

JavaRDD<MyModel> processedRows =
        csvLines
            .filter(myFilterObj)
            .map(myMapObj);

Что дает мне результат ниже:

region   |   keyword   | termFrequency
--------------------------------
REGION1  |   milk      | 200
REGION2  |  lemon      | 100
REGION1  |  milk       | 100

Я хочу сгруппировать свои записи по region и keyword, добавить termFrequency и получить результат вывода, как показано ниже:

    region   |   keyword   | termFrequency
    --------------------------------
    REGION1  |   milk      | 300
    REGION2  |  lemon      | 100

Как этого добиться в JavaRDD?

1 Ответ

0 голосов
/ 12 ноября 2018

Не уверен, если лучший подход, но вы можете конвертировать в JavaPairRDD, используя Tuple2 региона и клавиатуры в качестве ключа и MyModel в качестве значения.

Затем вы вызываете reduByKey с функцией для суммирования termFrequency.

Наконец, если вам нужно, вы можете сопоставить с любым данным JavaRDD (например, JavaRDD)

            .mapToPair(myModel -> new Tuple2<>(new Tuple2<>(myModel.getRegion(), myModel.getKeyword()), myModel.getTermFrequency))
            .reduceByKey((v1, v2) -> v1 + v2)
            .map(v1 -> new MyModel(v1._1._1, v1._1._2, v1._2))

Вы также можете использовать вспомогательный класс вместо Tuple, чтобы сделать код более читабельным

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