Я хотел бы вычислить верхние 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
. Есть ли эквивалентный способ делать такие вещи?