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


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

«Прыгающее» окно определяет подмножество событий, произошедших в некоторый период времени, над которыми можно выполнить некоторые операции с множествами, например статистическую обработку. «Прыгающие» окна отличаются от окон количества и моментальных снимков тем, что они делят временную шкалу на регулярные интервалы независимо от моментов времени начала и окончания событий. StreamInsight допускает перекрывающиеся прыгающие окна, а также наличие промежутков между смежными окнами. 

Общее описание окон событий, сведения об их реализации и использовании в StreamInsight см. в разделе Использование окон событий.

Основные сведения о «прыгающих» окнах

«Прыгающие» окна — это окна, которые делают «прыжок» во времени вперед на фиксированный период. Окно определяется двумя промежутками времени: длина прыжка H и размер окна S. Для каждой единицы времени H создается новое окно размером S.

На следующем рисунке показан поток, имеющий ряд точечных событий. Вертикальные линии показывают, как «прыгающее» окно сегментирует временную шкалу. Здесь H равно S. Такие параметры определяют «прыгающее» окно, покрывающее временную шкалу без перекрытий и разрывов. Оно также называется переворачивающимся окном. Для удобства существует отдельный метод расширения для этого типа окон. Каждый оранжевый прямоугольник представляет поток окон и события, связанные с этим окном.

«Переворачивающееся» окно

Для каждого такого окна выполняется операция на основе множеств и вырабатывается результат с отметками времени, которые зависят от выходной политики, указанной для окна. Для выходной политики PointAlignToWindowEnd результат выглядит следующим образом:

«Переворачивающиеся» окна с PointAlignToWindowEnd

Если событие выходит за границы окна, оно содержится в нескольких окнах. На следующем рисунке показан поток, который содержит три таких интервальных события: e1, e2 и e3. Если длина прыжка H меньше размера окна S, то окна перекрываются так, что события в период перекрытия попадают в несколько окон, даже если это точечные события, которые не охватывают несколько окон.

Иллюстрация «прыгающего» окно

Обратите внимание, что этот рисунок показывает события в окнах, уже отсеченных входной политикой окна. Входной политикой, как и для всех остальных окон StreamInsight, является отсечение всех событий по размерам окна. Зависящие от времени агрегатные функции или операторы будут использовать в окнах это усеченное время существования событий вместо первоначального, иными словами, они не «заглядывают за» окно.

При необходимости может быть задан параметр выравнивания. Например, выравнивание по умолчанию для 24-часового «переворачивающегося» окна определяет время начала и окончания для каждого окна в полночь. Если задано пользовательское выравнивание (например, 24-часовое окно с 9:00 до 9:00 часов), то окна выравниваются относительно этой абсолютной точки на временной шкале (в данному случае — любого значения типа datetime, содержащего 9:00 во временной части). Параметр выравнивания должен быть предусмотрен как объект DateTime типа DateTimeKind.Utc.

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

«Прыгающее окно» с перекрывающимися событиями.

На следующем рисунке показан результат такого агрегирования в верхней части оконного потока, если выходной политикой является PointAlignToWindowEnd.

Агрегаты с PointAlignToWindowEnd

Для независимых от времени агрегатов, например Sum, Avg, Count и т. д., все результаты агрегирования на этой диаграмме содержат одно и то же значение, поскольку свой вклад в базовые окна всегда вносит одно и то же множество полезных данных, e1 и e2. Такое поведение повторяющихся результатов необходимо принимать во внимание, особенно если подобное окно должно применяться к группе, а операция должна выполняться с большим количеством групп. При частоте окон, большей частоты исходных событий (например, как показано на предыдущей диаграмме), частота событий входа будет значительной. Если результат агрегирования должен формироваться только при изменении входных данных, то вместо этого следует применять окно моментального снимка.

Выходные политики

PointAlignToWindowEnd

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

PointAlignToWindowEnd — это предусмотренная по умолчанию выходная политика для «прыгающего» окна, если выходная политика не указана.

ClipToWindowEnd

Применение этой выходной политики приводит к получению размера окна, который соответствует времени существования операции на основе множеств, как показано на следующей диаграмме. Следует учитывать, что это отражается на актуальности запроса.

Выходная политика ClipToWindowEnd для «прыгающих» оконНовая выходная политика для «прыгающих» окон

Поведение CTI

Обратите внимание, что «прыгающие» окна могут влиять на события увеличения текущего времени (CTI). Если выходной политикой является ClipToWindowEnd, то каждое событие CTI перемещается в начало соответствующего окна. Причина этого состоит в том, что значение размера окна присваивается результату операции в верхней части окна. Поэтому, пока в окне происходит получение событий, весь временной интервал окна может изменяться. Но если выходной политикой является NEW_POLICY, то события CTI передаются без изменения. Дополнительные сведения о событиях CTI см. в разделе Обработка времени приложения.

Определение «прыгающих» окон

«Прыгающее» окно определяется своим размером и размером прыжка, как показано в следующем примере.

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

Аргументом политики «прыгающего» окна в указанном выше примере является статическое свойство, которое возвращает экземпляр соответствующего класса политики.

Если длина прыжка и размер окна совпадают, может использоваться сокращенная версия, называемая переворачивающимся окном, как показано в следующем примере.

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

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

См. также

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

Агрегаты

TopK

Определяемые пользователем статистические функции и операторы

Окна количества

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

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