Как вычислить верхние k слов

Я хотел бы вычислить верхние k слова в приложении Spark-Streaming, с строками текста, собранными во временном окне.

В итоге я получил следующий код:

...
val window = stream.window(Seconds(30))

val wc = window
  .flatMap(line => line.split(" "))
  .map(w => (w, 1))
  .reduceByKey(_ + _)

wc.foreachRDD(rdd => {
  println("---------------------------------------------------")
  rdd.top(10)(Ordering.by(_._2)).zipWithIndex.foreach(println)
})
...

Кажется, что это работает.

Проблема: верхняя таблица слов k вычисляется с помощью функции foreachRDD, которая выполняет функцию top + print на каждом RDD, возвращаемом reduceByKey (переменная wc).

Оказывается, что reduceByKey возвращает DStream с одним RDD, поэтому приведенный выше код работает, но правильное поведение не гарантируется спецификациями.

Я ошибаюсь, и он работает при любых обстоятельствах?

Почему в искровом потоке нет возможности рассматривать DStream как один RDD вместо коллекции объектов RDD для выполнения более сложных преобразований?

То, что я имею в виду, это функция типа: dstream.withUnionRDD(rdd => ...), которая позволяет делать преобразования и действия на одном/объединении RDD. Есть ли эквивалентный способ делать такие вещи?

Ответ 1

На самом деле я совершенно неправильно понял концепцию DStream, состоящую из нескольких RDD. DStream выполняется несколькими RDD, но со временем.

В контексте микропакета DStream состоит из текущего RDD.

Таким образом, код всегда работает.