스트리밍 데이터 작업: 스트림 조인 - SQL애플리케이션용 Amazon Kinesis Data Analytics 개발자 가이드

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

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

스트리밍 데이터 작업: 스트림 조인

애플리케이션에 복수의 애플리케이션 내 스트림을 가질 수 있습니다. JOIN 쿼리를 작성하여 이들 스트림에 도착하는 데이터를 연결할 수 있습니다. 예를 들어 다음과 같은 애플리케이션 내 스트림이 있다고 가정하겠습니다.

  • OrderStream— 접수된 재고 주문을 받습니다.

    (orderId SqlType, ticker SqlType, amount SqlType, ROWTIME TimeStamp)
  • TradeStream— 해당 주문에 대한 주식 거래 결과를 수신합니다.

    (tradeId SqlType, orderId SqlType, ticker SqlType, amount SqlType, ticker SqlType, amount SqlType, ROWTIME TimeStamp)

다음은 이들 스트림의 데이터를 연결하는 JOIN 쿼리 예입니다.

예 1: 주문 시점으로부터 1분 내에 거래가 이루어진 주문 보고

이 예에서 쿼리를 통해 OrderStreamTradeStream을 조인합니다. 그러나 주문 시점에서 1분 이내에 체결된 매매한 원하는 것이기 때문에 쿼리는 TradeStream에 대해 1분 윈도우를 정의합니다. 윈도우 형식 쿼리에 대한 자세한 설명은 슬라이딩 윈도우 섹션을 참조하십시오.

SELECT STREAM ROWTIME, o.orderId, o.ticker, o.amount AS orderAmount, t.amount AS tradeAmount FROM OrderStream AS o JOIN TradeStream OVER (RANGE INTERVAL '1' MINUTE PRECEDING) AS t ON o.orderId = t.orderId;

WINDOW 절을 명시적으로 사용하고 다음과 같이 앞선 쿼리를 작성하는 윈도우를 정의할 수 있습니다.

SELECT STREAM ROWTIME, o.orderId, o.ticker, o.amount AS orderAmount, t.amount AS tradeAmount FROM OrderStream AS o JOIN TradeStream OVER t ON o.orderId = t.orderId WINDOW t AS (RANGE INTERVAL '1' MINUTE PRECEDING)

이 쿼리를 애플리케이션 코드에 포함시키는 경우 애플리케이션 코드는 연속적으로 실행됩니다. OrderStream에 도착한 모든 레코드에 대해, 주문이 이루어 진 후 1분 윈도우 내에 거래가 있으면 애플리케이션은 출력을 방출합니다.

앞선 쿼리에서의 조인은 TradeStream에 일치하는 레코드가 있는 경우에만 OrderStream에 있는 레코드를 방출하는(또는 그 반대) 내부 조인입니다. 외부 조인을 사용하면 또 다른 흥미로운 시나리오를 만들 수 있습니다. 주식 주문이 이루어진 후 동일한 윈도우 내에 체결된 매매가 없는 주식 주문과 동일한 윈도우 내에 있지만 다른 주문에 대해 체결된 매매가 보고되도록 원한다고 가정해 보겠습니다. 다음은 외부 조인의 예입니다.

SELECT STREAM ROWTIME, o.orderId, o.ticker, o.amount AS orderAmount, t.ticker, t.tradeId, t.amount AS tradeAmount, FROM OrderStream AS o LEFT OUTER JOIN TradeStream OVER (RANGE INTERVAL '1' MINUTE PRECEDING) AS t ON o.orderId = t.orderId;