Compartilhar via


Agregações

Os exemplos deste tópico mostram como executar operações de agregação em janelas de eventos. As funções de agregação com suporte são as seguintes:

  • Média de um campo de carga numérico (avg).

  • Resumo de um campo de carga (sum).

  • Mínimo de um campo de carga (min).

  • Máximo de um campo de carga (max).

  • Contagem de eventos (count).

Agregações são operações baseadas em conjuntos. Ou seja, elas executam alguma computação em subconjuntos de dados. Esses subconjuntos são especificados como janelas de eventos, agrupando eventos ao longo da linha do tempo. Segundo essa definição, as agregações só podem ser aplicadas a janelas e não a fluxos de eventos ordinários. Elas são fornecidas como métodos de extensão em CepWindowStream<T>. Para obter mais informações sobre janelas, consulte Usando janelas de eventos.

Quando a mesma sintaxe é usada como operação de projeção, os resultados das operações de agregação se tornam campos de carga de valor escalar. As agregações sobre janelas são computadas incrementalmente. Isso significa que os resultados de agregações anteriores são atualizados quando um evento entra em ou deixa a janela de agregação. Esteja ciente de que isso pode afetar a precisão dos números.

avg, sum, min e max usam um parâmetro de entrada, representando o valor a ser agregado. Ele costuma ser uma referência a um campo de evento. O parâmetro de entrada é fornecido como uma expressão lambda, conforme mostrado nos exemplos a seguir. A agregação count conta eventos inteiros da janela e, portanto, não tem um parâmetro.

A manipulação de valores nulos é consistente com funções semelhantes em Transact-SQL:

  • Em sum, nulo é tratado como 0 (zero).

  • Em min, qualquer valor é menor que nulo.

  • Em max, qualquer valor é maior que nulo.

  • Em TopK, quando eventos são classificados de acordo com um campo de carga, o nulo é sempre menor que qualquer valor.

As funções mínima e máxima podem ser usadas em qualquer tipo que implemente uma comparação, como tipos numéricos, lexicográficos (string) ou temporais (datetime).

Exemplos

Os exemplos a seguir mostram como aplicar funções de agregação a eventos definidos em Janelas de salto e Janela de instantâneo. Observe que, nesta versão, Janelas de contagem não pode ser usado com agregações internas ou TopK.

A. Agregação em uma janela de salto

Uma janela de salto se repete com o passar do tempo com regularidade e frequência. Por exemplo, a agregação de dados de evento em uma hora, recalculando a cada cinco minutos, corresponde a uma janela de salto com um tamanho de janela de 1h e um tamanho de salto de 5min, conforme mostrado no exemplo a seguir.

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

O operador de janela é aplicado ao fluxo de entrada, produzindo um CepWindowStream<T>. Cada elemento win nesse fluxo representa uma janela que contém eventos.

O exemplo a seguir conta eventos dentro de cada hora cheia. Ele uma janela de tombamento. Esse é um atalho para uma janela de salto cujo tamanho de salto é igual ao tamanho da janela.

var countHourly = from win in hourStream.TumblingWindow(TimeSpan.FromHours(1))
                  select new { count = win.Count() };

B. Agregação em uma janela de instantâneo

No exemplo a seguir, a cláusula from aplica uma janela de instantâneo ao fluxo inputStream. No exemplo, os resultados da agregação Sum são atribuídos ao campo de carga e.i e os resultados da agregação Avg são computados com base no campo de carga e.f. Adicionalmente, a agregação de contagem é usada. O exemplo também mostra como combinar várias agregações na mesma instrução. Elas são todas computadas em relação à mesma janela.

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

É possível inserir agregações em expressões complexas, e uma expressão pode conter mais de uma agregação, conforme mostrado no exemplo a seguir.

var result = from w in inputStream.Snapshot()
             select new { ratio = w.Sum(e => e.i) / w.Sum(e => e.f) };

Consulte também

Conceitos

Modificações de carimbo de data/hora

Usando janelas de eventos

Janelas de salto

Janelas de contagem

Janela de instantâneo