2017-06-28 3 views
0

, so dass ich eine Streaming-Aufgabe mit Flink DataStream simulieren und ich möchte eine SQL-Abfrage für jedes Fenster ausführen.Flink DataStream - führen Sie SQL-Abfrage in einem Fenster, tun Sie Orderby

Lasst uns sagen, dass dies die Abfrage

SELECT name, age, sum(days), avg(salary) 
FROM employees 
WHERE age > 25 
GROUP BY name, age 
ORDER BY name, age 

ist eine harte Zeit, ich habe es zu Flink zu übersetzen. Aus meinem Verständnis, um den Durchschnitt zu berechnen, muss ich es manuell mit .apply() und WindowFunction tun. Aber wie berechne ich dann die Summe? Auch manuell in derselben WindowFunction?
Ich frage mich auch, ob es möglich ist, Ordnung im ganzen Fenster zu machen?

Unten ist der Pseudocode von dem, was ich bisher dachte. Jede Hilfe wäre willkommen! Vielen Dank!

employeesStream 
.filter(new FilterFunction() ....) \\ where clause 
.keyby(nameIndex, ageIndex)   \\ group by?? 
.timeWindow(Time.seconds(10), Time.seconds(1)) 
.apply(new WindowFunction() ....)  \\ calculate average (and sum?) 
// order by?? 

überprüfte ich die Table API aber es scheint nicht viel Operationen unterstützt für das Streaming werden, z orderBy.

Antwort

0

Bestellung im Streaming ist nicht trivial. Wie willst du etwas sortieren, das niemals endet? In Ihrem Beispiel möchten Sie einen Durchschnitt oder eine Summe berechnen, die nur einen Wert pro Fenster darstellt. Sie können keinen Wert sortieren.

Eine andere Möglichkeit besteht darin, alle Werte zu puffern und auf einen Indikator der Vollständigkeit zu warten, um mit der Sortierung zu beginnen. Dank der Ereigniszeit und Wasserzeichen ist es möglich, einen Stream zu sortieren, wenn Sie wissen, dass Sie alle Werte bis zu einer bestimmten Zeit gesehen haben (aka Wasserzeichen).

Die Sortierung nach Ereigniszeit wurde kürzlich eingeführt und wird Teil der Flink 1.4 Table API. Ein Beispiel finden Sie unter here.

Verwandte Themen