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

对于新项目,建议您使用新的适用于 Apache Flink Studio 的托管服务,而不是使用适用于 SQL 应用程序的 Kinesis Data Analytics。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,该查询会在其中发出记录(反之亦然)。使用外部连接可以创建另一个有趣场景。假设您需要查询在提交股票订单的 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;