TopK

Negli esempi di questo argomento viene illustrato l'utilizzo dell'operazione TopK per classificare gli eventi in un flusso della finestra e restituire i primi N eventi in base a un ordine di classificazione crescente o decrescente. L'operazione TopK viene specificata tramite il metodo di estensione Take(), che prevede un flusso di tipo CepOrderedStream<T>. Questo tipo viene prodotto non appena si specifica la clausola orderby. La clausola orderby deve funzionare sugli eventi all'interno di un flusso CepWindowStream<T>. È pertanto necessario che al flusso di input venga applicato un operatore della finestra snapshot o di salto (a cascata).

In caso di valori equivalenti, tramite l'operazione TopK verranno restituiti più di N eventi, pertanto si tratta sempre di un comportamento deterministico.

Con TopK non vengono utilizzate finestre basate sul conteggio.

TopK viene implementato come operatore che non varia in base al tempo. Le durate degli eventi di output verranno pertanto impostate in base ai criteri di output della finestra.

Esempi

Nell'esempio seguente vengono considerati i primi cinque eventi di ogni finestra snapshot definiti per il flusso di input inputStream e viene generato un nuovo flusso di eventi. Gli eventi di ogni finestra vengono disposti secondo l'ordine crescente dei valori nei campi payload e.f combinati con l'ordine decrescente dei valori nel campo payload e.i.

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

var topfive = (from window in inputStream.Snapshot()
               from e in window
               orderby e.f ascending, e.i descending
               select e).Take(5);

È possibile utilizzare una proiezione in una clausola Take, come mostrato dall'esempio seguente.

var result = (from win in source
                       .TumblingWindow(TimeSpan.FromMinutes(10), HoppingWindowOutputPolicy.ClipToWindowEnd)
                   from r in win
                   orderby r.Value descending
                   select new { scaled = r.Value / 10, r.SourceId }).Take(2, e => new
                                         {
                                             ranking = e.Rank,
                                             e.Payload. scaled,
                                             e.Payload.SourceId
                                         });

Se il risultato effettivo della classificazione deve essere proiettato nel payload degli eventi, viene utilizzata un'espressione lambda corrispondente. L'accesso alla classificazione viene quindi eseguito tramite la proprietà Rank, mentre i campi payload sono accessibili tramite la proprietà Payload.

var topthree = (from window in inputStream.HoppingWindow(TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(2), WindowOutputPolicy.ClipToWindowEnd)
               from e in window
               orderby e.f ascending, e.i descending
               select e).Take(3, e => new
               {
                   ranking = e.Rank,
                   f = e.Payload.f,
                   i = e.Payload.i
               });

Nella figura seguente viene illustrata la proprietà temporale di un risultato TopK. In questo esempio viene utilizzata una finestra di salto con TopK, in modo che per ogni finestra vengano selezionati i due eventi con i valori di payload più elevati per il campo payload val.

var two = (from window in inputStream.HoppingWindow(TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(10), WindowOutputPolicy.ClipToWindowEnd)
               from e in window
               orderby e.val descending
               select e).Take(2);

Le caselle arancioni rappresentano le finestre. Nella figura viene illustrato in che modo, tramite TopK, le durate dei payload selezionati vengono impostate sulla dimensione della finestra. In questo caso si presuppongono eventi punto nel flusso di input che consentono di visualizzare il valore del campo payload val. Si noti che il criterio di output specificato ClipToWindowEnd consente di assegnare l'intervallo di tempo della finestra agli eventi del risultato.

Visualizzazione della proprietà temporale di un risultato TopK.

È importante comprendere il comportamento dell'operazione TopK per i valori equivalenti. Si prenda in considerazione l'esempio seguente in cui nel flusso di input sono contenuti valori duplicati e vengono calcolati i primi 2 valori di una finestra a cascata. In questo esempio, viene utilizzato il criterio di output predefinito PointAlignToWindowEnd:

Operatore TopK con criteri PointAlignToWindowEnd

I primi 2 valori nella prima finestra sono 3 e 2. Tutti gli eventi in cui il campo classificato dispone di uno di questi valori saranno inclusi nel risultato contenente i tre eventi di questo esempio.

Vedere anche

Concetti

Concetti relativi al server StreamInsight

Utilizzo delle finestre di eventi

Finestre di salto

Finestre snapshot