Поделиться через


TopK

В примерах из этого раздела показано ранжирование событий в потоке окон и возвращение первых N событий в порядке возрастания или убывания ранга с помощью операции TopK. TopK указывается в методе расширения Take(), который принимает поток типа CepOrderedStream<T>. Этот тип создается сразу после указания предложения orderby. Предложение orderby должно работать с событиями в пределах потока CepWindowStream<T>. Поэтому к входному потоку должен применяться оператор окна моментального снимка или «переворачивающегося» окна.

При наличии неопределенного выбора TopK возвращает больше чем N событий, поэтому всегда ведет себя детерминировано.

TopK не работает с окнами на основе количества.

TopK реализуется в виде оператора без учета времени. Поэтому значения времени существования событий выхода будут заданы в соответствии с выходной политикой окна.

Примеры

В следующем примере из каждого окна моментального снимка, определенного для входного потока inputStream, берутся пять старших событий и создается новый поток событий. События в каждом окне упорядочиваются в порядке возрастания значения в полях полезных данных e.f в сочетании с порядком убывания значений поля полезных данных 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);

В предложении Take можно использовать проекцию, как показано в следующем примере.

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

Если фактический результат ранжирования необходимо спроецировать на полезные данные событий, то используется соответствующее лямбда-выражение. Затем доступ к рангу выполняется через свойство Rank, а доступ к полям полезных данных выполняется через свойство 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
               });

На следующем рисунке показано временное свойство результата TopK. В этом примере используется «прыгающее» окно с TopK, где из каждого окна выбираются два события с максимальными значениями в поле полезных данных 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);

Оранжевые прямоугольники представляют окна. На рисунке показано, как TopK задает время существования выбранных полезных данных в соответствии с размером окна. Здесь предполагается, что точечные события во входном потоке отображают значение поля полезных данных val. Необходимо учитывать, что указанная выходная политика ClipToWindowEnd назначает интервал времени окна результирующим событиям.

Отображает временное свойство результата TopK.

Важно понимать поведение TopK при наличии неопределенного выбора. Рассмотрим следующий пример, в котором входной поток содержит повторяющиеся значения и вычисляются два лучших значения на основе «переворачивающегося» окна. В этом примере используется предусмотренная по умолчанию выходная политика PointAlignToWindowEnd:

Оператор TopK с политикой PointAlignToWindowEnd

Лучшими двумя значениями в первом окне являются 3 и 2. В результат будут включены все события, в которых ранжированное поле имеет одно из этих значений, что составляет в этом примере три события.

См. также

Основные понятия

Основные понятия сервера служб StreamInsight

Использование окон событий

Прыгающие окна

Окна моментальных снимков