조인

 

이 항목의 예에서는 조인 연산을 사용하여 서로 다른 스트림의 값에 상관 관계를 지정하는 방법을 보여 줍니다. 조인 연산은 한 입력 스트림의 각 이벤트와 하나 이상의 다른 입력 스트림의 각 이벤트를 비교합니다. 비교하는 이벤트의 유효한 시간 간격이 겹치고 조인 조건이 유지되는 경우 연산에서 출력 이벤트가 하나 생성됩니다.

일반적인 LINQ 사용 방법에 따라 on … equals 절을 사용하거나 둘 이상의 입력 스트림을 참조할 수 있는 where 절을 통해 두 입력 스트림 간의 동등 조인 조건자로 조인 조건을 지정할 수 있습니다. 동등 조인 조건자는 where x.a equals y.a 같이 단일 필드를 비교하거나, where {x.a, x.b} equals {y.a, y.b} 또는 where x equals y 같이 복합 키를 비교할 수 있습니다.

내부 조인

내부 조인 연산은 둘 이상의 입력 스트림 간의 조인 조건자가 true이면 이들 입력 스트림의 모든 이벤트를 반환합니다. 조인 조건자는 조인 중인 이벤트 스트림의 페이로드 필드를 비교하는 식입니다. 내부 조인에서는 지정된 다른 이벤트 스트림에 일치하는 이벤트가 없는 모든 이벤트를 지웁니다.

동등 조인

다음 예에서는 stream1 스트림의 이벤트를 stream2 스트림의 이벤트와 비교합니다. 스트림에서 on 절에 정의된 동등 조건을 충족하는 이벤트는 두 이벤트의 시간 간격에서 겹치는 동시에 조인되어 e1 이벤트의 ij 페이로드 필드와 e2 이벤트의 j 필드를 포함하는 새 이벤트로 출력됩니다.

// Assuming the following input event type for both stream1 and stream2.  
public class MyPayload  
{  
    public int i;  
    public float j;  
}  
  
var equiJoin = from e1 in stream1  
               join e2 in stream2  
               on e1.i equals e2.i  
               select new { e1.i, e1.j, e2.j };  

같음 조건자에는 기본 유형과 복합 유형의 비교가 모두 허용됩니다. 예를 들면 on {e1i, e1j} equals {e2i, e2j}와 같이 조인할 수 있습니다.

크로스 조인

크로스 조인(카티전 곱) 연산은 각 스트림의 이벤트 간격에서 겹치는 기간 동안 첫 번째 스트림의 각 이벤트와 두 번째 스트림의 각 이벤트를 조합한 결과인 이벤트 스트림을 반환합니다. where 절에 필터 식을 사용하여 각 입력 스트림의 이벤트를 제한할 수 있습니다. 두 입력 스트림의 이벤트를 비교하는 경우에는 같음 여부를 확인하는 where 절이 포함된 크로스 조인과 해당 on … equals 절이 포함된 동등 조인이 같습니다. 같지 않음 조건자를 사용하거나 비교할 입력 스트림이 둘 이상인 경우에는 크로스 조인을 사용해야 합니다.

다음 예에서는 stream1에서 페이로드 필드 i의 값이 3보다 큰 이벤트를 stream2에서 페이로드 필드 j의 값이 10보다 작은 이벤트와 조인합니다.

var crossJoin = from e1 in stream1  
                from e2 in stream2  
                where e1.i > 3 && e2.j < 10  
                select new { e1.i, e2.j };  

참고


SelectMany는 상호 조인의 편리한 구문 표현입니다. 스트림 선택기 매개 변수를 참조하지 않는 쿼리의 경우 IQStreamable<>CepStream<>에서 작성된 코드 간에 차이가 없습니다.

Left Anti-Semi-Join

Left Anti-Semi-Join에서는 각 지정 시간에 대해 일반 조인의 결과가 비어 있는 경우에만 왼쪽의 각 이벤트에 대해 조인 결과를 생성합니다. 이 연산은 이벤트가 없는 간격을 검색하는 데 유용합니다.

다음 예에서는 Left Anti-Semi Join을 수행합니다.

left.LeftAntiJoin
(right, (x, y) => left.A > right.B)  
  

다음 그림에서는 두 예의 입력 스트림이 포함된 위의 조인 결과를 보여 줍니다. 여기서 조인 조건은 true로 가정됩니다. 중간의 일반 조인 결과도 표시됩니다.

두 개의 스트림이 포함된 anti semi join 예

참고


StreamInsight 2.0 및 이전 버전에서는 다음 예와 같이 Left Anti-Semi-Join을 CepStream 스트림에 대해 명시적으로 지정해야 합니다.

// CepStream example:  
var leftAntiSemiJoin = from left in stream1   
                       where (from right in stream2   
                              where left.v == right.v  
                              select right).IsEmpty()  
                       select left;  
  

여러 개의 스트림 조인

다음 예와 같이 단일 쿼리에서 여러 스트림을 조인할 수 있습니다.

var slopetest = from f in fastSignal  
                          from s in slowSignal  
                          from r in refSignal  
                          select new { alarm = f.avg / s.avg < r.Threshold };