Share via


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 서버 개념

이벤트 창 사용

도약 창

스냅숏 창