あるグループに対するウィンドウ集約UDFの処理フローは、次のテーブルに示すとおりです。
フェーズ | phase.getPhase()の値 | 説明 |
---|---|---|
1 | Phase.AGR_INIT | このフェーズは、新しい集約グループまたは最初の行の開始時に、パーティションごとに一度だけトリガーされます。 メソッドでは、次のことを実行する必要があります。
|
2 | Phase.AGR_DETAIL | このフェーズは、行が前進する度にトリガーされます。 Vantageにより、各グループに対して集約される行ごとにメソッドが1回ずつ呼び出されます。 メソッドでは、UDFの引数入力データと、そのグループに対して定義されている中間記憶域を結合する必要があります。 |
3 | Phase.AGR_MOVINGTRAIL | このフェーズは、移動ウィンドウ タイプ(非累積/非レポート ウィンドウ タイプ)に適用します。 このフェーズは、ウィンドウを指す前進ポインタがグループの終端またはファイルの終端に到達したときに、移動ウィンドウの最後の数行によってのみトリガーされます。 このフェーズはメソッドに行も値も提供せず、主にグループまたはファイルの終端に到達しつつあることをメソッドに表示するために使用されます。 メソッドは、ウィンドウがグループやファイルの終端方向に縮小するのに応じて、実際のサイズを反映するように必要な内部カウントまたは関連する値を調整するために、このフェーズを使用します。 |
4 | Phase.AGR_FINAL | このフェーズは、最終的に評価された結果を結果行に移動する必要が生じたときに、呼び出されます。 グループが予期する入力はもはやなくなり、メソッドはグループの最終結果を生成します。 |
5 | Phase.AGR_NODATA | このフェーズが関係してくるのは、集約するデータが何もない場合だけです。 |
Phase.AGR_COMBINEフェーズはウィンドウ集約UDFには適用しません。
- pre_windowサイズ: この値はPRECEDING句の一部として指定されます。現在の行より前の行をポイントしている場合、このフィールドの値は負になります。このフィールドは、累積ウィンドウとレポート ウィンドウのタイプには適用しません。その場合、このフィールドは0に初期化されます。
- post_windowサイズ: この値はFOLLOWING句の一部として指定されます。現在の行より前の行をポイントしている場合、このフィールドの値は負になります。このフィールドは、累積ウィンドウとレポート ウィンドウのタイプには適用しません。その場合、このフィールドは0に初期化されます。
- window_size: 累積ウィンドウ タイプでは、この値は-1になります。レポート ウィンドウ タイプでは、この値は-2になります。通常ウィンドウ タイプでは、この値は「post_windowサイズ -pre_windowサイズ+1」になります(+1は、現在の行の分)。
ウィンドウのサイズに応じた、行のキャッシュを維持する必要があります。このキャッシュは、これまでに読み取った行の合計を示すカウンタ値の保守に役立ちます。例えば、Cがカウンタを表わすとすると、評価対象の行のウィンドウは次のようになります。
if (C < window_size), window size would be C else window size would be as indicated in function context.
ウィンドウの起点はC - window_sizeになり、ウィンドウの終端はCと同じになります。各種のウィンドウの組み合わせ(PRECEDING/FOLLOWING/CURRENTなど)に関わる複雑性は、Vantageによって処理されます。ユーザーに必要なことは、行のウィンドウ キャッシュを保守し、この行のキャッシュに対する関数のセマンティクスを実装するだけです。
ウィンドウ集約関数を実行するJavaコードのサンプルについては、Javaウィンドウ集約関数を参照してください。