Compartilhar via


TopK

Os exemplos deste tópico demonstram o uso da operação TopK para classificar eventos em um fluxo de janelas e retornar os N primeiros eventos com base em uma ordem de classificação crescente ou decrescente. O TopK é especificado pelo método de extensão Take(), que aguarda um fluxo do tipo CepOrderedStream<T>. Esse tipo é gerado assim que uma cláusula orderby é especificada. A cláusula orderby deve funcionar em eventos dentro de um fluxo CepWindowStream<T>. Portanto, um operador de janela de instantâneo ou de salto (em cascata) deve ser aplicado ao fluxo de entrada.

No caso das ligações, TopK retornará mais de N eventos, portanto, ele sempre se comporta de modo determinístico.

O TopK não funciona com janelas baseadas em contagem.

O TopK é implementado como um operador sem detecção de hora. Assim, os tempos de vida dos eventos de saída serão definidos de acordo com a política de saída da janela.

Exemplos

O exemplo a seguir usa os cinco eventos principais de cada janela de instantâneo definidos para o fluxo de entrada inputStream e gera um novo fluxo de eventos. Os eventos em cada janela são classificados na ordem crescente dos valores nos campos de carga e.f combinados com a ordem decrescente dos valores no campo de carga 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);

É possível usar uma projeção em uma cláusula Take, conforme mostrado no exemplo a seguir.

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 o resultado da classificação real precisar ser projetado na carga do evento, uma expressão lambda correspondente será usada. Assim, a classificação é acessada pela propriedade Rank, e os campos de carga são acessíveis pela propriedade 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
               });

A ilustração a seguir mostra a propriedade temporal de um resultado do TopK. Este exemplo usa uma janela de salto com TopK, de tal forma que são escolhidos os dois eventos com os valores de carga mais altos para o campo de carga val em cada janela.

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

As caixas laranjas representam as janelas. A ilustração mostra como o TopK define os tempos de vida das cargas selecionadas para o tamanho de janela. Aqui, pressupomos eventos pontuais no fluxo de entrada, exibindo o valor do seu campo de carga val. Observe que a política de saída especificada de ClipToWindowEnd atribui a duração da janela aos eventos de resultado.

Mostra a propriedade temporal de um resultado TopK.

É importante entender esse comportamento de TopK nas ligações. Consideremos o exemplo a seguir, em que o fluxo de entrada contém valores duplicados e os dois primeiros valores em uma janela em cascata são computados. Neste exemplo, a política de saída padrão de PointAlignToWindowEnd é usada:

Operador TopK com política PointAlignToWindowEnd

Os dois primeiros valores da primeira janela são 3 e 2. Todos os eventos em que o campo classificado tem um desses valores serão incluídos nos resultado, que contém três eventos neste exemplo.

Consulte também

Conceitos

Conceitos do servidor StreamInsight

Usando janelas de eventos

Janelas de salto

Janela de instantâneo