Как ReduceByKeyAndWindow работает в потоковой передаче Spark? - PullRequest
0 голосов
/ 16 марта 2019

Я изучаю потоковую передачу искры и узнаю некоторые хеш-теги из некоторых производственных журналов.

В некоторых примерах я нашел следующий код:

val words = statuses.flatMap(line => line.split(" "))

val tags = words.filter(w => w.startsWith("#"))

val tagKeyValues = tags.map(tag => (tag, 1))

val tagCounts = tagKeyValues.reduceByKeyAndWindow( (x,y) => x + y, (x,y) => x - y, Seconds(300), Seconds(1))

Код работает нормально.Но я так и не понял, как работает этот reduByKeyAndWindow?Почему мы уменьшаем значения во втором аргументе?

1 Ответ

2 голосов
/ 16 марта 2019

Функция обратного уменьшения используется для оптимизации работы скользящего окна. Когда длительность окна составляет 300 с, а длительность интервала составляет 1 с, новое уменьшенное значение может быть вычислено из предыдущего уменьшенного значения путем вычитания 1 с старых данных, которые выпадают из нового окна, и добавления одной секунды новых данных. Существует также версия reduceByKeyAndWindow без обратной функции, которую можно использовать, если функция не обратима.

Реализация алгоритма довольно многословна и проста для понимания https://github.com/apache/spark/blob/5264164a67df498b73facae207eda12ee133be7d/streaming/src/main/scala/org/apache/spark/streaming/dstream/ReducedWindowedDStream.scala#L79

...