APPLY(Azure Stream Analytics)

APPLY 연산자를 사용하면 쿼리의 외부 테이블 식에서 반환한 각 행에 대해 테이블 반환 함수를 호출할 수 있습니다. 테이블 반환 함수는 오른쪽 입력이 되고 외부 테이블 식은 왼쪽 입력이 됩니다. 오른쪽 입력은 왼쪽 입력에서 각 행에 대해 평가되고, 생성된 행은 최종 출력을 위해 결합됩니다. APPLY 연산자에 의해 생성되는 열 목록은 왼쪽 입력의 열 집합 뒤에 오른쪽 입력에서 반환된 열 목록을 추가한 것입니다.

APPLY에는 CROSS APPLY 및 OUTER APPLY의 두 가지 형태가 있습니다.

CROSS APPLY는 테이블 반환 함수로부터 결과 집합을 생성하는 외부 테이블의 행만 반환합니다. CROSS APPLY의 결과는 TIMESTAMP BY의 대상 값으로 사용할 수 없습니다. 그러나 CROSS APPLY를 수행하는 하나의 Azure Stream Analytics 작업을 사용하고 두 번째 작업을 사용하여 TIMESTAMP BY를 수행할 수 있습니다.

OUTER APPLY는 결과 집합을 생성하는 행과 그렇지 않은 행을 모두 반환하고, 테이블 반환 함수에 의해 생성된 열에는 NULL 값을 표시합니다.

Azure Stream Analytics에는 배열 및 레코드 형식 필드 작업을 용이하게 하기 위해 두 가지 테이블 반환 함수를 사용할 수 있습니다. GetArrayElementsGetRecordProperties입니다.

Syntax

  
<input> {CROSS | OUTER} APPLY <elements_selector>  
  
<input> ::= input_name |  input_alias  
  
<elements_selector> ::=   
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name  
  

인수

input_name | input_alias

입력 스트림의 이름이나 별칭입니다.

column_name

입력 스트림 열의 이름입니다.

element_name

테이블 반환 함수의 결과를 포함하는 새 열의 이름입니다.

반환 형식

출력은 초기 페이로드를 포함하는 레코드이며 테이블 반환 함수의 결과를 포함하는 레코드 'element_name'입니다.

GetArrayElements 함수의 경우 결과는 두 필드가 있는 레코드가 됩니다.

  • ArrayIndex: 배열의 요소 인덱스

  • ArrayValue: 배열의 요소 값.

GetRecordProperties 함수의 경우 결과는 다음 두 필드가 있는 레코드가 됩니다.

  • PropertyName: 레코드에 있는 속성의 이름입니다.

  • PropertyValue: 레코드의 속성 값입니다.

예제

이 예제에서는 tollbooth 시나리오를 확장하는 경우 자동차에 둘 이상의 번호판이 있을 수 있다고 가정합니다(예: 트레일러를 견인하는 자동차는 두 개 있음). C ross/outer apply는 이 배열을 평면화하는(여기서는 번호판당 하나의 행을 가져오는) 데 사용할 수 있습니다.

CREATE TABLE input(TollId nvarchar(max), EntryTime datetime, Licenses array)  
  
SELECT e.TollId, e.EntryTime, flat.ArrayValue AS licensePlate   
   FROM input AS e   
   CROSS APPLY GetArrayElements(e.Licenses) AS flat  
  

번호판 없이 자동차를 추적하기 위해서도 outer apply를 사용하도록 쿼리를 수정할 수 있습니다.

SELECT e.TollId, e.EntryTime,   
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex  
   FROM input AS e   
   OUTER APPLY GetArrayElements(e.Licenses) AS flat  
  

중첩된 배열(배열의 배열)를 사용하는 또 다른 예입니다.

WITH firstQuery AS (  
   SELECT input.TollId, input.EntryTime,   
   flat.ArrayIndex AS i1, flat.ArrayValue AS licenses   
      FROM input   
      CROSS APPLY GetArrayElements(input.ArrayOfArray) AS flat)  
  
SELECT firstQuery.TollId, firstQuery.EntryTime, firstQuery.i1,   
flat2.ArrayIndex AS i2, flat2.ArrayValue AS license  
   FROM firstQuery  
   CROSS APPLY GetArrayElements(firstQuery.licenses) AS flat2