はじめに
先日、以下の記事を発表しました。
新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語(のパラダイム)を学ぶことは、特別に楽しいことです。
ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。
本稿情報のソースとして、下記ドキュメントを参照ください。
集約とウィンドウ処理
基本
集計は、入力値のストリームを消費し、出力値のストリームを生成するものと考えることができます。
デフォルトでは、集計が入力を消費するたびに出力が生成されます。
この場合、各出力に関連付けられた時間は、対応する入力に関連付けられた時間と同じであり、出力の値は、その時点までに消費されたすべての入力に集計を適用した結果です。
Purchase.amount | sum()
Time | Purchase.amount | sum() |
---|---|---|
2012-02-23 | 5 | 5 |
2012-05-10 | 2 | 7 |
2018-11-03 | 13 | 20 |
2019-10-26 | 4 | 24 |
ウィンドウ集計
集計のデフォルトの動作では、入力が消費されるたびに、その値がこれまでに確認されたすべての入力の集計である出力が生成されます。この動作は、ウィンドウ集計を使用して制御できます。
「何を」集約するかを制御する
一つの側面として、「何を」集約するか、つまり集計で使用される入力値のセットについて記述します。デフォルトの動作では、すべての入力値が寄与します。場合によっては、最新の N 個の入力のみを含める、または特定のイベントが発生してからのすべての入力を含めることが必要な場合があります。
「いつ」集約されるかを制御する
別の側面では、集計の結果がいつ生成されるべきかを記述します。デフォルトの動作では、入力値が消費されるたびに出力値が生成されます。場合によっては、毎日の終わりに特定のイベントが発生したときに出力値を生成することが望ましい場合があります。
ウィンドウ処理の例
集計関数のwindow
パラメータにウィンドウ ジェネレータを提供することで、集計をウィンドウ処理することができます。たとえば、 ウィンドウ ジェネレーターsliding(2, is_valid(Purchase))
は、最近の 2 つの有効な購入の合計を計算します。
なお、このウィンドウジェネレーターsliding(n, bool)
は、集約される内容に影響を与えますが、各入力に関連付けられた出力を生成するときの動作はデフォルトのままです。
Purchase.amount | sum(window = sliding(2, is_valid(Purchase))
他の例として、ウィンドウ ジェネレーターyearly()
を使用して、各年の初めにすべての購入の合計を計算できます。
Purchase.amount | sum(window = since(yearly()))
バウンダリーの扱い
yearly
のような条件では、毎年といったバウンダリーが対象となります。
Fenl はこのバウンダリーの扱いについて、自動的に、式に含まれるすべてのエンティティが持つデータセット内の中で最も古いイベントから最新のイベントまでの時間間隔に制限します。
繰り返しの集計
Fenl式において、以下のように複数回(イベントを)集計することもできます。
Purchase.amount | sum() | mean()
一連の結果を下記に示します。
各集計式の詳細についてはドキュメントを参照ください。