Aggregazioni

Negli esempi di questo argomento verrà illustrato come effettuare operazioni di aggregazione in finestre di eventi. Le funzioni di aggregazione supportate sono le seguenti:

  • Media in un campo payload numerico (avg).

  • Somma in un campo payload (sum).

  • Minimo in un campo payload (min).

  • Massimo in un campo payload (max).

  • Conteggio di eventi (count).

Le aggregazioni sono operazioni basate su set. Questo significa che consentono di eseguire calcoli su subset di dati. Questi subset vengono specificati come finestre di eventi, in cui gli eventi vengono raggruppati lungo la sequenza temporale. In base a questa definizione, le aggregazioni possono essere applicate solo alle finestre e non ai flussi di eventi comuni. Vengono fornite come metodi di estensione in CepWindowStream<T>. Per ulteriori informazioni sulle finestre, vedere Utilizzo delle finestre di eventi.

Utilizzando la stessa sintassi di un'operazione di proiezione, i risultati delle operazioni di aggregazione diventano campi payload con valore scalare. Le aggregazioni sulle finestre vengono calcolate in modo incrementale. Questo significa che i risultati delle aggregazioni precedenti vengono aggiornati quando un evento entra nella finestra di aggregazione o esce da essa. Tenere presente che questo può influire sulla precisione dei numeri.

avg, sum, min e max accettano un parametro di input, che rappresenta il valore da aggregare. In genere, si tratta di un riferimento a un campo evento. Il parametro di input viene fornito come espressione lambda, come illustrato negli esempi seguenti. L'aggregazione count consente di contare interi eventi nella finestra, pertanto non dispone di alcun parametro.

La gestione di valori Null è coerente con funzioni simili di Transact-SQL:

  • In sum il valore Null è trattato come 0 (zero).

  • In min qualsiasi valore è minore di Null.

  • In max qualsiasi valore è maggiore di Null.

  • In TopK quando gli eventi vengono classificati in base a un campo payload, il valore Null è sempre minore di qualsiasi altro valore.

Le funzioni minimo e massimo possono essere utilizzate in qualsiasi tipo che implementa un operatore di confronto, ad esempio tipi numerici, lessicografici (string) o temporali (datetime).

Esempi

Negli esempi seguenti verrà illustrato come applicare le funzioni di aggregazione agli eventi definiti in Finestre di salto e Finestre snapshot. Si noti che, in questa versione, le Finestre di conteggio non possono essere utilizzate con aggregazioni o operatori TopK incorporati.

A. Aggregazione in una finestra di salto

Una finestra di salto si ripete nel tempo con un intervallo e una frequenza regolari. L'aggregazione dei dati degli eventi in un'ora, ricalcolando il valore ogni cinque minuti, corrisponde, ad esempio, a una finestra di salto con una dimensione della finestra di 1 h e una dimensione hop di 5 min come mostrato nell'esempio seguente.

// 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) }; 

L'operatore della finestra viene applicato al flusso di input, restituendo CepWindowStream<T>. Ogni elemento win in questo flusso rappresenta una finestra che contiene eventi.

Nell'esempio seguente vengono conteggiati gli eventi nel corso di ogni ora completa. Viene utilizzata una finestra a cascata. Si tratta di una soluzione rapida per una finestra di salto la cui dimensione hop è uguale alla dimensione della finestra.

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

B. Aggregazione in una finestra snapshot

Nell'esempio seguente la clausola from viene applicata a una finestra snapshot nel flusso inputStream. Nell'esempio i risultati dell'aggregazione Sum vengono assegnati al campo payload e.i e i risultati dell'aggregazione Avg vengono calcolati in base al campo payload e.f. Viene inoltre utilizzata l'aggregazione Count. Nell'esempio viene illustrato anche come combinare diverse aggregazioni nella stessa istruzione. Le aggregazioni vengono tutte calcolate rispetto alla stessa finestra.

// 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() };

È possibile incorporare aggregazioni in espressioni complesse. In un'espressione possono essere contenute più di un'aggregazione, come mostrato nell'esempio seguente.

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

Vedere anche

Concetti

Modifiche dei timestamp

Utilizzo delle finestre di eventi

Finestre di salto

Finestre di conteggio

Finestre snapshot