TopK

이 항목의 예에서는 TopK 연산을 사용하여 창 스트림의 이벤트에 순위를 지정하고 오름차순 또는 내림차순 순위에 따라 상위 N개 이벤트를 반환하는 방법을 보여 줍니다. TopK는 CepOrderedStream<T> 형식 스트림을 사용하는 Take() 확장 메서드를 통해 지정합니다. 이 형식은 orderby 절을 지정하면 즉시 생성됩니다. orderby 절은 CepWindowStream<T> 스트림 내의 이벤트에 대해 작동해야 합니다. 따라서 입력 스트림에 스냅숏 또는 도약(연속) 창 연산자를 적용합니다.

순위가 동일한 이벤트가 있을 경우 TopK는 N개가 넘는 이벤트를 반환하므로 동작은 항상 결정적 방식입니다.

개수 기반 창에서는 TopK를 사용할 수 없습니다.

TopK는 시간이 중요하지 않은 연산자로 구현됩니다. 따라서 출력 이벤트의 수명은 창의 출력 정책에 따라 설정됩니다.

다음 예에서는 inputStream 입력 스트림에 대해 정의된 각 스냅숏 창에서 상위 5개 이벤트를 가져와 새 이벤트 스트림을 생성합니다. 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 결과의 임시 속성을 보여 줍니다. 이 예에서는 val 페이로드 필드의 페이로드 값이 가장 큰 두 이벤트를 각 창에서 선택하도록 TopK가 포함된 도약 창을 사용합니다.

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의 동작을 이해하는 것이 중요합니다. 다음 예에서는 입력 스트림에 중복된 값이 포함되어 있으며 연속 창에 대해 상위 2개의 값이 계산됩니다. 이 예에서는 기본 출력 정책인 PointAlignToWindowEnd가 사용됩니다.

PointAlignToWindowEnd 정책이 포함된 TopK 연산자

첫 번째 창에서 상위 2개의 값은 3과 2입니다. 순위 필드에 이러한 값 중 하나를 포함하는 모든 이벤트가 결과에 포함됩니다. 이 예의 경우 세 개의 이벤트가 결과에 포함됩니다.

참고 항목

개념

StreamInsight 서버 개념

이벤트 창 사용

도약 창

스냅숏 창