彙總

本主題的範例將示範如何針對事件視窗執行彙總作業。支援的彙總函式如下所示:

  • 數值裝載欄位的平均值 (avg)。

  • 裝載欄位的總和 (sum)。

  • 裝載欄位的最小值 (min)。

  • 裝載欄位的最大值 (max)。

  • 事件的計數 (count)。

彙總是以集合為基礎的運算。也就是說,彙總會執行資料子集的某些運算。這些子集會指定為事件視窗,沿著時間表分組事件。根據這個定義,彙總只能套用至視窗,而無法套用至一般事件資料流。彙總會當做 CepWindowStream<T> 上的擴充方法來提供。如需有關視窗的詳細資訊,請參閱<使用事件視窗>。

如果使用與投射作業相同的語法,彙總作業的結果就會變成純量值裝載欄位。視窗的彙總是以累加方式計算的。也就是說,當事件進入或離開彙總視窗時,就會更新先前的彙總結果。請注意,這可能會影響數字精確度。

avg、sum、min 和 max 全都會採用一個輸入參數,表示要彙總的值。通常,這是事件欄位的參考。輸入參數會提供為 Lambda 運算式,如底下範例所示。count 彙總會計算視窗中的完整事件數目,因此沒有任何參數。

null 值的處理與 Transact-SQL 中類似函數的處理一致:

  • 在 sum 中,會將 null 視為 0 (零)。

  • 在 min 中,任何值都小於 null。

  • 在 max 中,任何值都大於 null。

  • 在 TopK 中根據裝載欄位為事件排名時,null 永遠小於任何值。

最小值與最大值函式可以應用到實作比較子的任何類型,例如數值、字典編撰 (字串) 或時態 (日期時間) 類型。

範例

下列範例示範如何將彙總函式套用到跳動視窗快照集視窗中定義的事件。請注意在這個版本中,計數視窗不能搭配內建彙總或 TopK 使用。

A. 跳動視窗的彙總

跳動視窗會以固定期間和頻率重複它本身一段期間。例如,彙總一個小時內的事件資料,每隔五分鐘重新計算會對應到視窗大小為 1h 且跳動大小為 5 分鐘的跳動視窗,如以下範例所示。

// Assuming the following input event type for inputStream:
public class MyPayload 
{ 
    public int i; 
    public float f; 
}
var avgHourly = from win in inputStream.HoppingWindow(TimeSpan.FromHours(1), TimeSpan.FromMinutes(5))
                  select new { hourlyavg = win.Avg(e => e.f) }; 

視窗運算子會套用到輸入資料流,產生 CepWindowStream<T>。這個資料流中的每個 win 元素都代表包含事件的視窗。

下列範例會計算每一整個小時內的事件數目。它會使用輪轉視窗。這是跳動大小等於視窗大小之跳動視窗的捷徑。

var countHourly = from win in hourStream.TumblingWindow(TimeSpan.FromHours(1))
                  select new { count = win.Count() };

B. 快照集視窗的彙總

在下列範例中,from 子句會將快照集視窗套用在 inputStream 資料流上。在此範例中,Sum 彙總結果會指派給 e.i 裝載欄位,而且 Avg 彙總結果會根據 e.f 裝載欄位來計算。此外,也會使用計數彙總。此範例也會示範如何將數個彙總結合在相同的陳述式中。它們都會根據相同的視窗進行計算。

// Assuming the following input event type for inputStream:
public class MyPayload 
{ 
    public int i; 
    public float f; 
}

// Multiple aggregations over a snapshot window
var snapshotAgg = from w in inputStream.Snapshot()
                  select new { sum = w.Sum(e => e.i),
                               avg = w.Avg(e => e.f),
                               count = w.Count() };

您可以將彙總內嵌到複雜的運算式中,而且一個運算式可以包含多個彙總,如以下範例所示。

var result = from w in inputStream.Snapshot()
             select new { ratio = w.Sum(e => e.i) / w.Sum(e => e.f) };

請參閱

概念

時間戳記修改

使用事件視窗

跳動視窗

計數視窗

快照集視窗