Agregaciones
En los ejemplos de este tema se muestra cómo realizar operaciones de agregación en ventanas de eventos. Las funciones de agregación admitidas son las siguientes:
Promedio de un campo de carga numérico (avg).
Suma de un campo de carga (sum).
Mínimo de un campo de carga (min).
Máximo de un campo de carga (max).
Recuento de eventos (count).
Las agregaciones son operaciones basadas en conjunto. Es decir, realizan algún cálculo en subconjuntos de datos. Estos subconjuntos se especifican como ventanas de evento y agrupan los eventos de la escala de tiempo. Según esta definición, las agregaciones solo se pueden aplicar a ventanas y no a flujos de eventos normales. Se proporcionan como métodos de extensión en CepWindowStream<T>. Para obtener más información acerca de las ventanas, vea Utilizar ventanas de eventos.
Con la misma sintaxis que una operación de proyección, los resultados de las operaciones de agregación se convierten en campos de carga con valor escalar. Las agregaciones con ventanas se calculan de forma incremental. Dicho de otro modo, los resultados de agregaciones anteriores se actualizan cuando un evento entra en la ventana de agregación o sale de ella. Tenga en cuenta que esto puede afectar a la precisión de números.
avg, sum, min y max toman un parámetro de entrada, que representa el valor que se va a agregar. Normalmente, se trata de una referencia a un campo de evento. El parámetro de entrada se proporciona como una expresión lambda, tal como se muestra en los ejemplos siguientes. El agregado count cuenta los eventos completos de la ventana y, por lo tanto, no tiene ningún parámetro.
El control de valores nulos es coherente con funciones similares en Transact-SQL:
En sum, NULL se trata como 0 (cero).
En min, cualquier valor es menor que NULL.
En max, cualquier valor es mayor que NULL.
En TopK, cuando los eventos se clasifican según un campo de carga útil, NULL siempre es menor que cualquier valor.
Las funciones de mínimo y máximo se pueden usar en cualquier tipo que implemente un comparador, como un comparador numérico, lexicográfico (cadena) o los tipos temporales (fecha y hora).
Ejemplos
En los siguientes ejemplos se muestra cómo aplicar funciones de agregación a eventos definidos en Ventanas de salto y Ventanas de instantánea. Observe que en esta versión, Ventanas de recuento no se puede usar con agregados integrados ni TopK.
A. Agregación en una ventana de salto
Una ventana de salto se repite a lo largo del tiempo con un período y una frecuencia regulares. Por ejemplo, al agregar los datos de evento de una hora, el recálculo cada cinco minutos corresponde a una ventana de salto con un tamaño de ventana de 1 hora y un tamaño de salto de 5 minutos, como se muestra en el ejemplo siguiente.
// Assuming the following input event type for inputStream:
public class MyPayload
{
public int i;
public float f;
}
var avgHourly = from win in inputStream.HoppingWindow(TimeSpan.FromHours(1), TimeSpan.FromMinutes(5))
select new { hourlyavg = win.Avg(e => e.f) };
El operador de ventana se aplica al flujo de entrada, produciendo CepWindowStream<T>. Cada elemento win de este flujo representa una ventana que contiene eventos.
En el siguiente ejemplo se cuentan los eventos dentro de cada hora completa. Se usa una ventana de saltos de tamaño constante. Se trata de una forma abreviada de hacer referencia a una ventana de salto cuyo tamaño de salto es igual al tamaño de la ventana.
var countHourly = from win in hourStream.TumblingWindow(TimeSpan.FromHours(1))
select new { count = win.Count() };
B. Agregación en una ventana de instantánea
En el siguiente ejemplo, la cláusula from aplica una ventana de instantánea del flujo inputStream. En el ejemplo, los resultados de la agregación Sum se asignan al campo de carga e.i y los resultados de la agregación Avg se calculan en función del campo de carga e.f. Además, se utiliza el agregado de recuento. En el ejemplo también se muestra cómo combinar varias agregaciones en la misma instrucción. Todas se calculan con respecto a la misma ventana.
// Assuming the following input event type for inputStream:
public class MyPayload
{
public int i;
public float f;
}
// Multiple aggregations over a snapshot window
var snapshotAgg = from w in inputStream.Snapshot()
select new { sum = w.Sum(e => e.i),
avg = w.Avg(e => e.f),
count = w.Count() };
Puede incrustar agregados en expresiones complejas y una expresión puede contener varios agregados, tal como se muestra en el siguiente ejemplo.
var result = from w in inputStream.Snapshot()
select new { ratio = w.Sum(e => e.i) / w.Sum(e => e.f) };