2016-06-02 3 views
1

Ich muss zwei Keyed Streams in einem Fenster beitreten. Aber ich muss zuerst die beiden Streams reduzieren und dann den Join auf das Aggregat anwenden, alles innerhalb desselben Fensters.Reduce und beitreten auf Fenster

Ich habe einige Zeit mit der Suche an Flink APIs ausgegeben, und ich finde, dass ein solche Anwendung Funktion in einem WindowedStream existiert

öffentlicher SingleOutputStreamOperator gilt (ReduceFunction reduceFunction, Windowfunktion)

Aber ich bin nicht in der Lage zu finden eine ähnliche Funktion in einem JoinedStream. Frage: Wäre dies eine nützliche Erweiterung zu Flink. Gibt es eine Problemumgehung, die ich für jetzt verwenden kann.

Antwort

0

Wenn Sie Verarbeitungszeitsemantik verwenden, können Sie die Fensteraggregation einfach unabhängig auf jeden Eingabestream anwenden und das Ergebnis in den Join einspeisen (natürlich müssen beide Aggregate und der Join dieselbe Fensterdefinition verwenden).

Etwas wie folgt aus:

WindowAssigner w = ... 
reducedStream1 = stream1.keyBy(...).window(w).apply(...); 
reducedStream2 = stream2.keyBy(...).window(w).apply(...); 
reducedStream1.join(reducedStream2) 
       .where(...).equalTo(...) 
       .window(w).apply(...); 

Zur Verarbeitung Zeit, müssten Sie Sie benutzerdefinierte Operator besitzen, schreiben mit:

stream1.coGroup(stream2) 
     .where(...).equalTo(...) 
     .window(...).apply(CoGroupFnction); 
+0

I Ereigniszeit verwende und ich am Ende ihrer Umsetzung coGroup mit genau wie das, was du vorgeschlagen hast. Vielen Dank. –