Ich möchte die oberen k Wörter in einer Spark-Streaming-Anwendung, mit Textzeilen in einem Zeitfenster gesammelt.Wie berechnet man die oberen k Wörter
landete ich mit dem folgenden Code auf:
...
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)
})
...
Es scheint zu funktionieren.
Problem: die obere k Wortdiagramm, das die foreachRDD
Funktion berechnet wird unter Verwendung, die auf jeder RDD
einen oberen + Druckfunktion ausführt durch reduceByKey
(die Variable wc
) zurückgeführt.
Es stellt sich heraus, dass reduceByKey
ein DStream
mit einer einzigen RDD
zurückkehrt, so dass die obige Code funktioniert, aber das richtige Verhalten wird durch die Spezifikationen nicht garantiert.
Bin ich falsch, und es funktioniert unter allen Umständen?
Warum gibt es nicht, in Spark-Streaming, eine Möglichkeit, eine DStream
als eine einzige RDD
, anstelle einer Sammlung von RDD
Objekte, um komplexere Transformationen auszuführen?
Was ich meine ist eine Funktion wie: dstream.withUnionRDD(rdd => ...)
, mit dem Sie Transformation und Aktionen auf eine einzige/Union RDD
. Gibt es einen entsprechenden Weg, solche Dinge zu tun?