Condividi tramite


Finestre di salto

Una finestra di salto consente di definire un subset di eventi che rientrano in un certo periodo di tempo e su cui è possibile eseguire alcuni calcoli basati su set, ad esempio un'aggregazione. Le finestre di salto differiscono dalle finestre snapshot e di conteggio in quanto dividono la sequenza temporale in intervalli regolari, indipendentemente dall'ora di inizio e di fine dell'evento. StreamInsight consente finestre di salto sovrapposte nonché finestre consecutive con gap tra di esse. 

Per una descrizione generale delle finestre di eventi e della relativa implementazione nonché dell'utilizzo in StreamInsight, vedere Utilizzo delle finestre di eventi.

Informazioni sulle finestre di salto

Le finestre di salto sono finestre consecutive che consentono di effettuare un "salto" in avanti nel tempo in base a un periodo fisso. La finestra è definita da due intervalli di tempo: la dimensione hop H e la dimensione della finestra S. Per ogni unità di tempo H viene creata una nuova finestra di dimensione S.

Nella figura seguente è illustrato un flusso con una serie di eventi punto. Le barre verticali indicano una finestra di salto che consente la segmentazione della cronologia. In questo caso, H è uguale a S. Ciò rappresenta una finestra di salto non sovrapposta e senza pause, nota anche come finestra a cascata. Per semplicità, esiste un metodo di estensione separato per questo tipo di finestra. Ogni casella arancione rappresenta il flusso di finestre e gli eventi associati alla finestra.

Finestre a cascata

Per ogni finestra, viene eseguita l'operazione basata su set e viene prodotto un risultato, con timestamp che dipendono dai criteri di output specificati con la finestra. Per il criterio di output PointAlignToWindowEnd, il risultato è il seguente:

Finestre a cascata con PointAlignToWindowEnd

Se un evento si estende oltre il limite di una finestra, è contenuto in più finestre. Nella figura successiva è illustrato un flusso contenente tre eventi intervallo, ovvero e1, e2 ed e3. Se la dimensione hop H è inferiore alla dimensione della finestra S, le finestre si sovrappongono in modo che gli eventi all'interno del periodo di sovrapposizione rientrino in più di una finestra, anche se si tratta di eventi punto che non si estendono in più finestre.

Illustrazione di una finestra di salto

In questa illustrazione vengono mostrati gli eventi nelle finestre già ritagliate dai criteri di input della finestra. I criteri di input, come per tutte le finestre StreamInsight, consistono nel ritagliare gli eventi in base alle dimensioni della finestra. Nelle finestre di una funzione di aggregazione o di un operatore che varia in base al tempo verranno utilizzate queste durate degli eventi ritagliate, anziché quelle originali, ovvero non sarà possibile 'vedere oltre' la finestra.

Facoltativamente, è possibile specificare un parametro di allineamento. L'allineamento predefinito per una finestra a cascata di 24 ore prevede, ad esempio, l'avvio e la fine di ogni finestra a mezzanotte. Se viene specificato un allineamento personalizzato (ad esempio una finestra di ventiquattro ore dalle 9.00 alle 9.00), il windowing viene allineato in base a questo punto assoluto nella cronologia (in questo caso, qualsiasi valore datetime contenente 9.00 come parte relativa all'ora). Il parametro di allineamento deve essere fornito come un oggetto DateTime di tipo DateTimeKind.Utc.

È importante comprendere che se si utilizzano le finestre di salto, l'operazione applicata basata su set consente la generazione di un risultato indipendentemente dal fatto che l'input sia stato modificato rispetto alla finestra precedente. Ciò è dovuto al fatto che le finestre di salto dividono la sequenza temporale in intervalli fissi. Nell'illustrazione seguente viene mostrata l'applicazione di una finestra di salto che è molto più lunga della dimensione hop. È tipico per gli scenari come ad esempio "ogni dieci secondi calcolare la media di tutti gli eventi entro cinque minuti".

Finestra di salto con eventi sovrapposti.

Nella figura seguente è illustrato il risultato di tale aggregazione nella parte superiore del flusso a finestre quando i criteri di output sono PointAlignToWindowEnd.

Aggregazioni con PointAlignToWindowEnd

Per una funzione di aggregazione che non varia in base al tempo, ad esempio Sum, Avg, Count e così via, tutti i risultati dell'aggregazione in questo diagramma presentano lo stesso valore, poiché si tratta sempre dello stesso set di payload, ovvero e1 ed e2, che contribuisce alle finestre sottostanti. Questo comportamento di risultati ripetitivi deve essere preso in considerazione soprattutto se tale finestra deve essere applicata all'interno di un'operazione di raggruppamento e applicazione con un numero elevato di gruppi. Con una frequenza della finestra maggiore rispetto alla frequenza dell'evento originale (ad esempio come mostrato nel diagramma precedente), la frequenza dell'evento di output sarà significativa. Se è consigliabile che un risultato dell'aggregazione venga generato solo se l'input cambia, è necessario utilizzare una finestra snapshot.

Criteri di output

PointAlignToWindowEnd

Questi criteri di output consentono di restituire un evento punto la cui ora di inizio è l'ora di fine della finestra, come mostrato nel diagramma precedente. Questi nuovi criteri di output sono utili quando si combina il risultato con un altro flusso, poiché esiste un solo risultato valido in ogni momento tramite cui viene espresso il risultato dell'aggregazione più recente in quel momento. Una finestra di salto con questi criteri di output può essere combinata con il modello di progettazione da punti a segnale per creare un flusso continuo di risultati dell'aggregazione in cui, in ogni momento, è incluso un evento intervallo contenente l'ultimo risultato noto.

PointAlignToWindowEnd è il criterio di output predefinito per una finestra di salto se questo tipo di criteri non è specificato.

ClipToWindowEnd

Questi criteri di output consentono di restituire una dimensione della finestra che corrisponde alla durata dell'operazione basata su set, come mostrato nel diagramma seguente. Si noti che tale situazione comporta diverse implicazioni per la dinamicità della query.

Criteri di output ClipToWindowEnd per le finestre di saltoNuovi criteri di output per le finestre di salto

Comportamento CTI

Si noti che le finestre di salto possono avere effetto sugli eventi CTI (Current Time Increment). Se il criterio di output è ClipToWindowEnd, ogni evento CTI verrà spostato all'inizio della rispettiva finestra, poiché le dimensioni della finestra vengono assegnate al risultato dell'operazione nella parte superiore della finestra. Pertanto, finché vengono ricevuti gli eventi all'interno della finestra, l'intero intervallo di tempo della finestra è soggetto a modifiche. Tuttavia, quando il criterio di output è NEW_POLICY, gli eventi CTI vengono passati senza modifiche. Per ulteriori informazioni sugli eventi CTI, vedere Avanzamento del tempo applicazione.

Definizione delle finestre di salto

Una finestra di salto è definita dalle dimensioni della finestra e dalla dimensione hop, come mostrato nell'esempio seguente.

var hoppingAgg = from w in inputStream.HoppingWindow(TimeSpan.FromHours(1),
                                                     TimeSpan.FromMinutes(10))
                 select new { sum = w.Sum(e => e.i) };

L'argomento dei criteri della finestra di salto nell'esempio precedente è una proprietà statica tramite cui viene restituita un'istanza della classe di criteri corrispondenti.

Se la dimensione hop e le dimensioni della finestra sono uguali, è possibile utilizzare una versione abbreviata denominata finestra a cascata, come illustrato nell'esempio seguente.

var tumblingAgg = from w in inputStream.TumblingWindow(TimeSpan.FromHours(1))
                  select new { sum = w.Sum(e => e.i) };

L'allineamento a salto (o a cascata) della finestra è un parametro facoltativo. Nell'esempio seguente ogni finestra inizia e finisce alle 9.00. UTC (Universal Time Coordinate).

var alignment = new DateTime(TimeSpan.FromHours(9).Ticks, DateTimeKind.Utc);
var snapshotAgg = from w in inputStream.TumblingWindow(
                         TimeSpan.FromHours(24),
                         alignment,
                         HoppingWindowOutputPolicy.ClipToWindowEnd)
                  select new { sum = w.Sum(e => e.i) };

Vedere anche

Concetti

Aggregazioni

TopK

Funzioni di aggregazione e operatori definiti dall'utente

Finestre di conteggio

Finestre snapshot

Utilizzo delle finestre di eventi