TopK

 

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

System_CAPS_ICON_note.jpg 참고


CEPStream<T> 스트림의 경우 Take() 확장 메서드는 CepOrderedStream<T> 형식 스트림을 사용합니다. 이 항목의 설명은 IQStreamableCEPStream 스트림에 모두 해당됩니다.

순위가 동일한 이벤트가 있을 경우 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;   
}  
  
// IQStreamable example:  
var topfive = (from window in inputStream.Snapshot()  
               from b in  
                   (from e in window  
                    orderby e.f ascending, e.i descending  
                    select e).Take(5)  
               select b;  
  

// CEPStream example:  
var topfive = (from window in inputStream.Snapshot()  
               from e in window  
               orderby e.f ascending, e.i descending  
               select e).Take(5);  
  

다음 예와 같이 Take 절에서 프로젝션을 사용할 수 있습니다.

  
// IQStreamable example:  
var result = (from win in source  
                       .TumblingWindow(TimeSpan.FromMinutes(10))  
                   from b in   
                       (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  
                                              })  
                   select b;  
  

// CEPStream example:  
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 속성을 통해 페이로드 필드에 액세스할 수 있습니다.

  
// IQStreamable example:  
var topthree = (from window in inputStream.HoppingWindow(TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(2))  
               from b in  
                   (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  
                    })  
               select b;  
  

  
// CEPStream example:  
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가 포함된 도약 창을 사용합니다.

  
// IQStreamable example:  
var two = (from window in inputStream.HoppingWindow(TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(10))  
               from b in  
                   (from e in window  
                    orderby e.val descending  
                    select e).Take(2)  
               select b;  
  

  
// CEPStream example:  
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 서버 개념
이벤트 창 사용
도약 창
스냅숏 창

표시: