Ventanas de salto

Una ventana de salto define un subconjunto de eventos que están dentro de un periodo de tiempo y sobre el que se puede realizar algún cálculo basado en conjuntos, por ejemplo una agregación. Las ventanas de salto difieren de las de recuento y de instantánea en que dividen la escala de tiempo a los intervalos regulares, independientemente de las horas de inicio y de finalización de los eventos. StreamInsight admite la superposición de las ventanas de salto, así como la existencia de huecos entre ventanas consecutivas. 

Para obtener una descripción general de las ventanas de evento y su implementación y uso en StreamInsight, vea Utilizar ventanas de eventos.

Descripción de las ventanas de salto

Las ventanas de salto son ventanas que "saltan" hacia adelante en el tiempo un período fijo. Dos intervalos de tiempo definen la ventana: el tamaño de salto H y el tamaño de ventana S. Por cada unidad de tiempo H se crea una nueva ventana de tamaño S.

La siguiente ilustración muestra un flujo con una serie de eventos de punto. Las barras verticales muestran una ventana de salto que segmenta la escala de tiempo. Aquí, H es igual a S, lo que representa una ventana de salto sin huecos y sin superposiciones, que se denomina también ventana de saltos de tamaño constante. Por razones de comodidad, existe un método de extensión independiente para este tipo de ventana. Cada cuadro naranja representa el flujo de ventanas y los eventos asociados a la ventana correspondiente.

Ventanas de saltos de tamaño constante

Por cada ventana de este tipo, se lleva a cabo la operación basada en conjunto y se produce un resultado, con marcas de tiempo que dependen de la directiva de salida especificada con la ventana. Para la directiva de salida PointAlignToWindowEnd, el resultado es el siguiente:

Ventanas de saltos de tamaño constante con PointAlignToWindowEnd

Si un evento va más allá del límite de una ventana, se encuentra en varias ventanas. La siguiente ilustración muestra un flujo que contiene tres eventos de intervalo donde esto es así: e1, e2 y e3. Si el tamaño de salto H es menor que el tamaño de ventana S, las ventanas se superpondrán, de forma que los eventos incluidos en el período superpuesto aparecerán en más de una ventana, aunque se trate de eventos de punto que no abarcan varias ventanas.

Ilustración de ventana de salto

Observe que esta ilustración muestra los eventos de las ventanas ya ajustados a la directiva de entrada de ventana. La directiva de entrada, como ocurre con todas las ventanas del StreamInsight, es recortar los eventos al tamaño de la ventana. Un agregado u operador que dependa del tiempo usará estas duraciones de evento recortadas en las ventanas, en vez de los originales, es decir, no “verá más allá” de la ventana.

Opcionalmente, se puede especificar un parámetro de alineación. Por ejemplo, la alineación predeterminada para una ventana de saltos de tamaño constante de 24 horas determina que cada ventana se inicie y finalice a medianoche. Si se especifica una alineación personalizada (por ejemplo, una ventana de veinticuatro horas de 9:00 a.m. a 9:00 a.m.), la operación de ventanas se alinea según este punto absoluto en la escala de tiempo (en este caso, cualquier valor de datetime que tenga 9:00 a.m. como parte de su tiempo). El parámetro de alineación se debe proporcionar como un objeto DateTime del tipo DateTimeKind.Utc.

Es importante entender que usando ventanas de salto, la operación basada en conjunto aplicada genera un resultado, sin tener en cuenta si la entrada ha cambiado con respecto a la ventana anterior. La razón es que las ventanas de salto dividen la escala de tiempo a lo largo de intervalos fijos. En la siguiente ilustración se muestra la aplicación de una ventana de salto que es mucho más larga que su tamaño de salto. Es algo habitual en casos como "cada diez segundos, calcular la media de todos los eventos de un plazo de cinco minutos".

Ventana de salto con eventos superpuestos

En la siguiente ilustración se muestra el resultado de este tipo de agregación encima del flujo con ventanas cuando la directiva de salida es PointAlignToWindowEnd.

Agregaciones con PointAlignToWindowEnd

En el caso de una agregación independiente del tiempo, como suma, promedio, recuento, etc., todos los resultados de la agregación de este diagrama llevan el mismo valor, porque siempre es el mismo conjunto de cargas, e1 y e2, el que contribuye a las ventanas subyacentes. Este comportamiento de resultados repetitivos se debe tener en cuenta, sobre todo si este tipo de ventana se va a aplicar dentro de un grupo y operación de aplicación con un elevado número de grupos. Con una frecuencia de ventana superior a la frecuencia del evento original (por ejemplo, como se muestra en el diagrama anterior), la tasa de eventos de salida será alta. Si se debe producir un resultado de agregación únicamente si cambia la entrada, se debe usar una ventana de instantánea.

Directivas de salida

PointAlignToWindowEnd

La directiva de salida produce un evento de punto donde la hora de inicio es la hora de finalización de la ventana, tal como se muestra en el diagrama anterior. Esta nueva directiva de salida resulta útil cuando se combina el resultado con otro flujo, ya que solo hay un único resultado válido en cada momento, lo que expresa el resultado de agregación más reciente en ese punto. Una ventana de salto con esta directiva de salida se puede combinar con el patrón de diseño de punto a señal a fin de crear un flujo continuo de resultados de agregación que, en cada momento, contiene un evento de intervalo que lleva el último resultado conocido.

PointAlignToWindowEnd es la directiva de salida predeterminada para una ventana de salto si no se especifica dicha directiva.

ClipToWindowEnd

Esta directiva de salida produce un tamaño de ventana que se corresponde con la duración de la operación basada en conjuntos, tal como se muestra en el siguiente diagrama. Observe que esto tiene implicaciones para la agilidad de la consulta.

Directiva de salida ClipToWindowEnd para ventanas de saltoNueva directiva de salida para ventanas de salto

Comportamiento de CTI

Observe que las ventanas de salto pueden afectar a los eventos de incremento de tiempo actual (CTI). Cuando la directiva de salida es ClipToWindowEnd, cada evento CTI se moverá al principio de la ventana respectiva. El motivo de esto suceda así se debe a que el tamaño de ventana se asigna al resultado de la operación realizada en la ventana. Por lo tanto, con tal de que se reciban los eventos dentro de la ventana, toda la duración de la ventana puede cambiar. No obstante, cuando la directiva de salida es NEW_POLICY, los eventos CTI se pasan sin cambios. Para obtener más información acerca de los eventos CTI, vea Adelantar tiempo de aplicación.

Definir ventanas de salto

Una ventana de salto se define por el tamaño de ventana y el tamaño del salto, como se muestra en el siguiente ejemplo.

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

El argumento de directiva para la ventana de salto del ejemplo anterior es una propiedad estática que devuelve una instancia de la clase de directiva correspondiente.

Si el tamaño del salto y el de la ventana son iguales, se puede usar una versión abreviada denominada ventana de saltos de tamaño constante, como se muestra en el siguiente ejemplo.

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

La alineación de la ventana de salto (o derrumbada) es un parámetro opcional. En el siguiente ejemplo, cada ventana se inicia y finaliza a las 9:00 a.m. Hora universal coordinada (UTC).

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

Vea también

Conceptos

Agregaciones

TopK

Agregados y operadores definidos por el usuario

Ventanas de recuento

Ventanas de instantánea

Utilizar ventanas de eventos