TopK

Los ejemplos de este tema muestran cómo usar la operación TopK para clasificar los eventos de un flujo de ventana y devolver los N eventos superiores en función del orden ascendente o descendente de la clasificación. TopK se especifica a través del método de extensión Take(), que espera un flujo de tipo CepOrderedStream<T>. Este tipo se genera en el momento en que se especifica una cláusula orderby. La cláusula orderby debe funcionar en eventos de un flujo CepWindowStream<T>. Por lo tanto, en el flujo de entrada se debe aplicar un operador de ventana de instantánea o de salto (tamaño constante).

En el caso de valores equivalentes, TopK devolverá más de N eventos, ya que siempre se comporta de forma determinista.

TopK no funciona en ventanas basadas en recuento.

TopK se implementa como un operador que no depende del tiempo. Por lo tanto, las duraciones de los eventos de salida se establecerán según la directiva de salida de la ventana.

En el siguiente ejemplo se toman los cinco eventos superiores de cada ventana de instantánea definida para el flujo de entrada inputStream y se genera un nuevo flujo de eventos. Los eventos de cada ventana se muestran según el orden ascendente de los valores de los campos de carga e.f y según el orden descendente de los valores del 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);

Puede usar una proyección en una cláusula Take, como se muestra en el ejemplo siguiente.

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

Si el resultado de clasificación real se debe proyectar en la carga de los eventos, se usa una expresión lambda correspondiente. El acceso posterior al rango se realiza mediante la propiedad Rank y a los campos de carga mediante la propiedad 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
               });

La siguiente ilustración muestra la propiedad de tiempo de un resultado de TopK. En este ejemplo se utiliza una ventana de salto con TopK, de manera que de cada ventana se eligen los dos eventos con los valores de carga superiores para el campo de carga 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);

Los cuadros naranjas representan las ventanas. La ilustración muestra cómo TopK establece las duraciones de las cargas seleccionadas en el tamaño de la ventana. Aquí, suponemos los eventos de punto del flujo de entrada, mostrando el valor de su campo de carga val. Observe que la directiva de salida especificada de ClipToWindowEnd asigna el intervalo de tiempo de la ventana a los eventos de resultado.

Muestra la propiedad temporal de un resultado TopK.

Es importante conocer el comportamiento de TopK para los valores equivalentes. Supongamos el siguiente ejemplo, donde el flujo de entrada contiene valores duplicados y se calculan los dos valores superiores en una ventana de saltos de tamaño constante. En este ejemplo, se usa la directiva de salida predeterminada de PointAlignToWindowEnd:

Operador TopK con la directiva PointAlignToWindowEnd

Los dos valores superiores de la primera ventana son 3 y 2. Todos los eventos donde el campo clasificado tiene uno de estos valores se incluirán en el resultado, que contiene tres eventos en este ejemplo.

Mostrar: