슬라이딩 윈도우 - Amazon Kinesis Data Analytics for SQL 애플리케이션 개발자 안내서

새 프로젝트의 경우 Kinesis Data Analytics for SQL 애플리케이션보다 새로운 Managed Service for Apache Flink Studio를 사용하는 것이 좋습니다. Managed Service for Apache Flink Studio는 사용 편의성과 고급 분석 기능을 결합하여 정교한 스트림 처리 애플리케이션을 몇 분 만에 구축할 수 있도록 합니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

슬라이딩 윈도우

GROUP BY를 사용하여 레코드를 그룹화하는 대신 시간 기반 또는 행 기반 윈도우를 정의할 수 있습니다. 명시적 WINDOW 절을 추가함으로써 이를 수행합니다.

이 경우 시간이 지남에 따라 창이 미끄러지면서 스트림에 새 레코드가 표시되면 Amazon Kinesis Data Analytics에서 출력을 내보냅니다. Kinesis Data Analytics는 윈도우 속의 행을 처리하여 이 출력을 내보냅니다. 윈도우는 이러한 유형의 처리에서 중첩될 수 있으며, 레코드는 복수의 윈도우의 일부일 수 있고 각 윈도우에서 처리될 수 있습니다. 다음 예는 슬라이딩 윈도우에 대한 설명입니다.

스트림 상에서 레코드를 계수하는 간단한 쿼리를 생각해 보겠습니다. 이 예에서는 5초 윈도우를 가정합니다. 다음 예 스트림에서 새 레코드가 t1, t2, t6, 및 t7에 도착하고 세 개의 레코드가 t8 초에 도착합니다.

다음 사항에 유의하세요:

  • 이 예에서는 5초 윈도우를 가정합니다. 5초 윈도우가 시간 경과에 따라 연속적으로 이동합니다.

  • 윈도우로 들어오는 모든 행에 대해 출력 행이 슬라이딩 윈도우에 의해 방출됩니다. 애플리케이션이 시작되면 바로 5초 윈도우가 지나가지 않은 상태에서도 스트림 상에 나타나는 모든 새 레코드에 대해 쿼리가 출력을 방출합니다. 예를 들어, 레코드가 처음 1초와 그 다음 1초에 나타날 때 쿼리가 출력을 방출합니다. 나중에 쿼리는 5초 윈도우에서 레코드를 처리합니다.

  • 윈도우는 시간 경과에 따라 이동합니다. 스트림 상의 오래된 레코드가 윈도우를 벗어나는 경우, 5초 윈도우에 속하는 새 레코드가 스트림에 나타나지 않는 한 쿼리가 출력을 방출하지 않습니다.

쿼리가 t0에 실행을 시작한다고 가정해 보겠습니다. 그러면 다음이 발생합니다:

  1. 시간 t0에 쿼리가 시작됩니다. 이 시점에는 레코드가 없기 때문에 쿼리가 출력(개수 값)을 방출하지 않습니다.

  2. t1 시점에 새 레코드가 스트림 상에 나타나고, 쿼리가 수 값 1을 방출합니다.

  3. t2 시점에 또 다른 레코드가 나타나고, 쿼리가 수 값 2를 방출합니다.

  4. 5초 윈도우가 시간 경과에 따라 이동합니다.

    • t3에서 슬라이딩 윈도우가 t3에서 t0으로 이동

    • t4에서 (슬라이딩 윈도우가 t4에서 t0으로 이동)

    • t5에서 슬라이딩 윈도우가 t5에서 t0으로 이동

    이 모든 시간에서 5초 윈도우는 동일한 레코드를 지닙니다—새 레코드는 없습니다. 따라서 쿼리는 출력을 방출하지 않습니다.

  5. 시간 t6에서 5초 윈도우는 (t6에서 t1). 쿼리가 t6에서 새 레코드 하나를 감지하고 출력 2를 방출합니다. t1에서 레코드는 더 이상 윈도우에 없으므로 계수되지 않습니다.

  6. t7에서 5초 윈도우는 t7에서 t2로 이동합니다. 쿼리가 t7에서 새 레코드 하나를 감지하고 출력 2를 방출합니다. t2에서 레코드는 더 이상 5초 윈도우에 없으므로 계수되지 않습니다.

  7. t8에서 5초 윈도우는 t8에서 t3로 이동합니다. 쿼리가 새 레코드 3개를 감지하므로 레코드 개수 5를 방출합니다.

요약하자면 윈도우는 크기가 고정이며 시간 경과에 따라 이동합니다. 쿼리는 새 레코드가 나타날 때 출력을 방출합니다.

참고

1시간 이내의 슬라이딩 윈도우를 사용하는 것이 좋습니다. 더 긴 윈도우를 사용하는 경우 애플리케이션을 정기적인 시스템 유지 관리 이후 다시 시작하는 데 시간이 더 걸립니다. 원본 데이터를 스트림에서 다시 읽어야 하기 때문입니다.

다음은 WINDOW 절을 사용하여 윈도우를 정의하고 집계를 수행하는 예 쿼리입니다. 쿼리가 GROUP BY를 지정하지 않기 때문에 쿼리는 슬라이딩 윈도우 접근 방식을 사용하여 스트림 상에서 레코드를 처리합니다.

예 1: 1분 슬라이딩 윈도우를 사용하여 스트림 처리하기

애플리케이션 내 스트림(SOURCE_SQL_STREAM_001)을 채우는 시작하기 실습에서의 데모 스트림을 검토합니다. 스키마는 다음과 같습니다.

(TICKER_SYMBOL VARCHAR(4), SECTOR varchar(16), CHANGE REAL, PRICE REAL)

애플리케이션이 1분 슬라이딩 윈도우를 사용하여 집계를 연산하도록 하는 것을 가정해 보겠습니다. 즉, 스트림 상에 나타나는 새 레코드 각각에 대해 애플리케이션이 앞선 1분 윈도우의 레코드에 집계를 적용함으로써 출력을 방출하도록 하는 것입니다.

다음의 시간 기반 윈도우 형식 쿼리를 사용할 수 있습니다. 쿼리는 WINDOW 절을 사용하여 1분 범위 간격을 정의합니다. WINDOWPARTITION BY 절이 슬라이딩 윈도우 내에 있는 티커 값을 기준으로 레코드를 그룹화합니다.

SELECT STREAM ticker_symbol, MIN(Price) OVER W1 AS Min_Price, MAX(Price) OVER W1 AS Max_Price, AVG(Price) OVER W1 AS Avg_Price FROM "SOURCE_SQL_STREAM_001" WINDOW W1 AS ( PARTITION BY ticker_symbol RANGE INTERVAL '1' MINUTE PRECEDING);
쿼리 테스트 방법
  1. 시작하기 실습에 따라 애플리케이션을 설정합니다.

  2. 애플리케이션 코드에서 SELECT 문을 앞의 SELECT 쿼리로 바꿉니다. 그러면 애플리케이션 코드가 다음과 같을 것입니다.

    CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ( ticker_symbol VARCHAR(10), Min_Price double, Max_Price double, Avg_Price double); CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM" SELECT STREAM ticker_symbol, MIN(Price) OVER W1 AS Min_Price, MAX(Price) OVER W1 AS Max_Price, AVG(Price) OVER W1 AS Avg_Price FROM "SOURCE_SQL_STREAM_001" WINDOW W1 AS ( PARTITION BY ticker_symbol RANGE INTERVAL '1' MINUTE PRECEDING);

예 2: 슬라이딩 윈도에 집계를 적용하는 퀴리

데모 스트림에 대한 다음 쿼리는 10초 윈도우에서의 각 티커의 가격 변동률 평균을 반환합니다.

SELECT STREAM Ticker_Symbol, AVG(Change / (Price - Change)) over W1 as Avg_Percent_Change FROM "SOURCE_SQL_STREAM_001" WINDOW W1 AS ( PARTITION BY ticker_symbol RANGE INTERVAL '10' SECOND PRECEDING);

쿼리 테스트 방법
  1. 시작하기 실습에 따라 애플리케이션을 설정합니다.

  2. 애플리케이션 코드에서 SELECT 문을 앞의 SELECT 쿼리로 바꿉니다. 그러면 애플리케이션 코드가 다음과 같을 것입니다.

    CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ( ticker_symbol VARCHAR(10), Avg_Percent_Change double); CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM" SELECT STREAM Ticker_Symbol, AVG(Change / (Price - Change)) over W1 as Avg_Percent_Change FROM "SOURCE_SQL_STREAM_001" WINDOW W1 AS ( PARTITION BY ticker_symbol RANGE INTERVAL '10' SECOND PRECEDING);

예 3: 동일한 스트림 상에서 복수의 슬라이딩 윈도우에서 나오는 데이터의 쿼리

각 열의 값이 동일한 스트림에 대해 정의된 여러 슬라이딩 윈도를 사용하여 계산되는 출력을 방출하도록 쿼리를 작성할 수 있습니다.

다음 예에서는 쿼리가 출력 티커, 가격, a2 및 a10을 방출합니다. 2행 이동 평균이 10행 이동 평균을 교차하는 티커 기호에 대해 출력을 방출합니다. a2a10 열 값은 2행 및 10행 슬라이딩 윈도우로부터 추출됩니다.

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ( ticker_symbol VARCHAR(12), price double, average_last2rows double, average_last10rows double); CREATE OR REPLACE PUMP "myPump" AS INSERT INTO "DESTINATION_SQL_STREAM" SELECT STREAM ticker_symbol, price, avg(price) over last2rows, avg(price) over last10rows FROM SOURCE_SQL_STREAM_001 WINDOW last2rows AS (PARTITION BY ticker_symbol ROWS 2 PRECEDING), last10rows AS (PARTITION BY ticker_symbol ROWS 10 PRECEDING);

데모 스트림에 대해 이 쿼리를 시험하려면 예 1에 설명된 테스트 절차에 따릅니다.