2016-06-18 26 views
0

Ich möchte eine andere WindowFn in einer solchen Weise erstellen, um Windows zu einem meiner Eingabeelemente basierend auf einem anderen Feld statt basierend auf dem Zeitstempel meines Eingabeeintrags zuweisen. Ich weiß, dass die vordefinierten Werte WindowFn von Google DataFlow SDK den Zeitstempel als Kriterium für die Zuweisung eines Fensters verwenden.So erstellen Sie ein personalisiertes WindowFn in Google Datenfluss

Genauer gesagt möchte ich eine Art SlidingWindows erstellen, aber anstatt Zeitstempel als die Fensterzuweisungskriterien zu betrachten, möchte ich ein anderes Feld als dieses Kriterium betrachten.

Wie kann ich meine benutzerdefinierte WindowFn erstellen? Was sind die Punkte, die ich bei der Erstellung meiner eigenen WindowFn berücksichtigen sollte?

Danke.

Antwort

2

Um ein neues WindowFn zu erstellen, müssen Sie nur von WindowFn oder einer Unterklasse erben und die verschiedenen abstrakten Methoden überschreiben.

In Ihrem Fall, Sie nicht Fenster Zusammenführung benötigen, so können Sie von NonMergingWindowFn erben, und Ihr Code so etwas wie

public class MyWindowFn extends NonMergingWindowFn<ElementT, IntervalWindow> { 
    public Collection<W> assignWindows(AssignContext c) { 
    return setOfWindowsElementShouldBeIn(c.element()); 
    } 

    public boolean isCompatible(WindowFn other) { 
    return other instanceof MyWindowFn; 
    } 

    public Coder<IntervalWindow> windowCoder() { 
    return IntervalWindow.getCoder(); 
    } 

    public W getSideInputWindow(final BoundedWindow window) { 
    // You may not need this if you won't ever be using PCollections windowed 
    // with this as side inputs. If that's the case, just throw. 
    // Otherwise you'll need to figure out how to map the main input windows 
    // into the windows generated by this WindowFn. 
    } 
} 
aussehen könnte