IBM Streams 4.3.0

TimeInterval ウィンドウ

SPL 言語は、イベント時間間隔で指定されたウィンドウ・ペインにタプルを収集する timeInterval ウィンドウをサポートします。

すべてのタプルを単一ストレージ域に保持するタンブリング・ウィンドウやスライディング・ウィンドウとは対照的に、timeInterval ウィンドウは複数のウィンドウ・ペインを管理することができます。各ウィンドウ・ペインは、イベント時間ドメインで定義された固定間隔に関連付けられ、ウィンドウに挿入される各タプルには、タプルのイベント時間を表すタイム・スタンプがあります。
注:
  • TimeInterval ウィンドウは、割り当てられたイベント時間値に基づいてタプルを処理します。
  • 時間ベースのウィンドウ・ポリシーは、システム時間に基づくタンブリング・ウィンドウおよびスライディング・ウィンドウの排除とトリガーを指定します。

以下の例では、タプルが T(n) として n のタイム・スタンプ値で示されています。ウィンドウは、以下の SPL window 節で定義されます。

window InputPort0 : timeInterval, intervalDuration(10.0), creationPeriod(5.0), discardAge(15.0);

以下の間隔それぞれに対するウィンドウ・ペインが作成されます。

[0, ..., 10)  
      [5, ..., 15) 
           [10, ..., 20)
                 [15, ..., 25)

--------------------------------> event-time

ウィンドウに挿入される各タプルは、そのイベント時間が属する間隔に割り当てられます。タプルは複数のウィンドウ・ペインに割り当てられることがあります。例えば、タイム・スタンプ値が T(7) のタプルがウィンドウ・ペイン [0 .. 10)[5 .. 15) に割り当てられます。

注: 間隔は左は端の値を含み、右は含みません。T(0) は間隔 [0 .. 10) に属しますが、T(10) はこの間隔に属しません。

timeInterval ウィンドウがパーティション化されている場合、その各ウィンドウ・ペインはパーティション化されます。

ウィンドウの定義

TimeInterval ウィンドウは TimeIntervalWindow テンプレート・クラスによって表される一方、ウィンドウ・ペインは TimeIntervalWindowPane テンプレート・クラスによって表されます。 両方とも Window クラスから継承され、Window と同じテンプレート・パラメーターがあります。タンブリング・ウィンドウやスライディング・ウィンドウとは異なり、timeInterval ウィンドウは、それぞれの時間間隔に関連付けられた TimeIntervalWindowPane インスタンスのためのマネージャーにすぎません。
注: TimeIntervalWindow ストレージにアクセスしようとすると、例外がスローされます。

TimeInterval ウィンドウは、TimeIntervalWindowOptions オブジェクトを使用して構成されます。 以下の例は、C++ で intervalDuration(10.0), creationPeriod(5.0), discardAge(15.0) のウィンドウ・オプションを作成する方法を示しています。

TimeIntervalWindowOptions().
    setIntervalDuration(timestamp(10.0)).
    setCreationPeriod(timestamp(5.0)).
    setDiscardAge(timestamp(15.0));

TimeInterval ウィンドウのコンストラクターには、3 つのパラメーターがあります。つまり、このウィンドウが含まれるオペレーターへの参照、このウィンドウが接続されている入力ポートの索引、およびウィンドウ・オプションです。

TimeIntervalWindow(*this, 0,
    SPL::TimeIntervalWindowOptions().
        setIntervalDuration(timestamp(10.0)).
        setCreationPeriod(timestamp(5.0)).
        setDiscardAge(timestamp(15.0)));

タプルの挿入

詳しくは、タプルの挿入 を参照してください。イベント時間間隔がオーバーラップすると、タプルは複数のウィンドウ・ペインに挿入されます。クライアントは、ウィンドウ・ペインが破棄されたときに同じタプルを複数回削除しないようにするために、タプルへの共有ポインターのウィンドウ (TimeIntervalWindow<streams_boost::shared_ptr<Tuple> > など) を作成する必要があります。

ウォーターマークの通知

SPL ランタイムは、ウィンドウを含むオペレーターがウォーターマークを進めるときに、ウィンドウに通知を送信します。TimeIntervalWindowPane はオペレーターのウォーターマークがイベント時間間隔の終わりと等しいかそれより大きくなったときに windowTriggerEvent をトリガーし、最後のトリガー以降にタプルが挿入された場合には、ウォーターマークを受け取ったときに再びトリガーします。前のトリガー・イベント以降に更新されたパーティションのみが、再びトリガーされます。

ウィンドウ・イベント

クライアントはハンドラーを TimeIntervalWindow に登録しますが、イベントは個々のウィンドウ・ペインによってトリガーされます。クライアントは、以下のイベントのハンドラーを登録できます。

beforeTupleInsertionEvent
タプルがウィンドウ・ペインに割り当てられる前にトリガーされます。
afterTupleInsertionEvent
タプルがウィンドウ・ペインに割り当てられた後にトリガーされます。
windowTriggerEvent
ウィンドウ・ペインがトリガーするたびにトリガーされます。
windowInitialFullEvent
ウィンドウ・ペインの状態が Incomplete から Complete に遷移した直後にトリガーされます。
windowCloseEvent
ウィンドウ・ペインの状態が Complete から Closed に遷移した直後にトリガーされます。

イベントの実行順序

ウィンドウ・イベントの実行は、タンブリング・ウィンドウやスライディング・ウィンドウと同様に、ウィンドウ・オブジェクト上で行われる insert 呼び出しによってオフに設定されます。

  • beforeTupleInsertionEvent および afterTupleInsertionEvent は、タプルの挿入によってオフに設定されます。
  • windowTriggerEventwindowInitialFullEventwindowCloseEvent はウォーターマーク通知によってオフに設定されます。ウォーターマークが最初にウィンドウ・ペインの間隔の終わりを過ぎると、ペインは最初に windowInitialFullEvent をトリガーし、その後に windowTriggerEvent をトリガーします。

パーティションおよびタプルの排除

timeInterval ウィンドウには、タプルまたはパーティションの排除ポリシーはありません。タプルの経過時間が discardAge 値を超えると、対応するウィンドウ・ペインはクローズされ、削除されます。C++ ウィンドウ・テンプレートが streams_boost::shared_ptr<Tuple> を使用してインスタンス化される場合、タプルはペインに参照されなくなると削除されます。

データ・アクセス

ウィンドウ・イベント・ハンドラーは、タンブリング・ウィンドウやスライディング・ウィンドウでのデータ・アクセスと同様に、ウィンドウ・ペインに保管されたタプルにアクセスすることができます。以下に、サンプルのトリガー・イベント・ハンドラーからのフラグメントを示します。

void MY_OPERATOR::onWindowTriggerEvent(
        WindowEventType::WindowType & window, 
        WindowEventType::PartitionType const & partition) 
{
    using namespace SPL::Functions::EventTime;

    // Access the pane's interval endpoint
    SPL::TriggerInfoProvider * p = dynamic_cast<SPL::TriggerInfoProvider *>(&window);
    if (p != NULL) {
        SPL::int64 const intervalEnd2(int64TicksFromTimestamp(
            p->getEndTime(), Milliseconds));
        SPLAPPTRC(L_DEBUG, "Interval end is " << intervalEnd2 << " millis" ,
            SPL_OPER_DBG);
    }

    . . .
    // Iterate through the tuples of the partition
    WindowType::DataType & data = window.getWindowData(partition);
    WindowType::DataType::const_iterator it;
    for (it = data.begin(); it != data.end(); it++) {
        IPort0Type const & tuple = **it;
        // access tuple attributes
        . . . 
    }
}