2015-04-09 1 views
11

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?

Antwort

2

Eigentlich habe ich das Konzept von DStream aus mehreren RDDs völlig missverstanden. Ein DStream wird von mehreren RDDs erstellt, aber im Laufe der Zeit.

Im Zusammenhang mit einem Mikro-Batch besteht DStream aus der aktuellen RDD.

So funktioniert der obige Code immer.