流式传输数据操作:流联接 - Amazon Kinesis Data Analytics 开发人员指南
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

流式传输数据操作:流联接

您可以在应用程序中拥有多个应用程序内部流。您可以编写 JOIN 查询关联到达这些流的数据。例如,假设您拥有以下应用程序内部流:

  • 订单流— 接收提交的股票订单。

    (orderId SqlType, ticker SqlType, amount SqlType, ROWTIME TimeStamp)
  • 贸易流— 接收为这些订单生成的股票交易。

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

以下 JOIN 查询示例与这些流上的数据相关联。

示例 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,该查询会在其中发出记录(反之亦然)。使用外部连接可以创建另一个有趣场景。假设您需要查询在提交股票订单的 1 分钟内没有交易的订单,以及在同一窗口内为其他一些订单报告交易。这是外部联接 示例。

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;