Генерировать гистограмму из JavaRDD - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь написать код для преобразования данных в Java RDD в гистограмму, чтобы я мог связать данные определенным образом. Например, для данных я хочу создать гистограмму размеров, чтобы я мог выяснить, в какой ячейке содержится сколько записей определенного диапазона размеров. Я могу получить значение в разных СДР, но я не уверен, что мне здесь не хватает.

Есть ли более простой способ сделать это?

0 - 1 GB - 2 entries
1 - 5GB - 4 entries 
and so on

EntryWithSize {
 long size;
 String entryId;
 String groupId;
}


JavaRDD<EntryWithSize> entries = getEntries();

JavaRDD<HistoSize> histoSizeJavaRDD = entryJavaRDD.keyBy(EntryWithSize::getGroupId)
                .combineByKey(
                        HistoSize::new,
                        (HistoSize h, EntryWithSize y) -> h.mergeWith(new HistoSize(y)),
                        HistoSize::mergeWith
                ).values();

    @Data
    @AllArgsConstructor
    static class HistoSize implements Serializable {
        int oneGB;
        int fiveGB;
        public HistoSize(EntryWithSize entry) {
            addSize(entry);
        }

        private void addSize(EntryWithSize entry) {
            long size = entry.getSize();
            if (size <= ONE_GB) {
                oneGB++;
            } else {
                fiveGB++;
            }
        }

        public HistoSize mergeWith(HistoSize other) {
            oneGB += other.oneGB;
            fiveGB += other.fiveGB;
            return this;
        }
    }

1 Ответ

0 голосов
/ 25 марта 2019

Я смог заставить его работать, используя сокращение на последней паре rdd.Мои тестовые данные были неверными, что привело к появлению красной сельди на выходе.

Function2<HistoSize, HistoSize, HistoSize> reduceSumFunc = (a, b) -> (new HistoSize(
            a.oneGB + b.oneGB,
            a.fiveGB + b.fiveGB,
    ));

HistoSize finalSize = histoSizeJavaRDD.reduce(reduceSumFunc);
...