Apache flink 如何通过datastrem API或Flink Table API/SQL在给定键和公共窗口上连接三个或更多数据流/表?

Apache flink 如何通过datastrem API或Flink Table API/SQL在给定键和公共窗口上连接三个或更多数据流/表?,apache-flink,flink-streaming,flink-sql,Apache Flink,Flink Streaming,Flink Sql,我想在给定的键和公共窗口上连接三个或更多的数据流或表。但是我不知道如何正确地编写代码。 官方文档给出了下面的示例,但是它只连接了两个数据流,那么如何在给定的键和公共窗口上连接三个或更多的数据流呢 dataStream.join(otherStream) .where(<key selector>).equalTo(<key selector>) .window(TumblingEventTimeWindows.of(Time.seconds(3))) .apply (ne

我想在给定的键和公共窗口上连接三个或更多的数据流或表。但是我不知道如何正确地编写代码。 官方文档给出了下面的示例,但是它只连接了两个数据流,那么如何在给定的键和公共窗口上连接三个或更多的数据流呢

dataStream.join(otherStream)
.where(<key selector>).equalTo(<key selector>)
.window(TumblingEventTimeWindows.of(Time.seconds(3)))
.apply (new JoinFunction () {...});
我尝试编写如下SQL,在给定的键和公共窗口上连接三个表,但我认为这是不对的

String SQL = "SELECT" +
            " grades.user1  , SUM(salaries.amount)   FROM grades " +
            " INNER JOIN salaries ON   grades.user1 =   salaries.user1 " +
            " INNER JOIN person ON   grades.user1 =   person.user1 "+
             "GROUP BY grades.user1, TUMBLE(grades.proctime,  INTERVAL '5' SECOND) "   
那么,通过datastrem API或Flink Table API/SQL在给定键和公共窗口上连接三个或更多数据流/表的正确方法是什么

于2018年6月16日更新,使问题更加清晰

对于Flink SQL,我所需要的,就像下面的伪代码一样,是用一个公共TumblingEventTimeWindow连接三个表,也就是说,数据流API的替代版本,不管是如何用Flink SQL表示的,也就是说连接三个表中的所有事件,这发生在同一个TumblingEventTimeWindow中

下面的Flink设计文档中似乎也提到了连接功能: “事件时间翻滚窗口流连接:连接同一翻滚事件时间窗口中两个流的元组”,我不知道Flink SQL是否实现了这种类型的Flink SQL连接功能


很难对您的问题给出明确的答案,因为您需要的连接的语义不清楚。DataStream API的窗口连接实现的语义不同于表API/SQL的窗口连接

在DataStream API上,您只需定义另一个联接,如下所示:

firstStream
  .join(secondStream)
    .where(<key selector>).equalTo(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(3)))
    .apply (new JoinFunction () {...})
  .join(thirdStream)
    .where(<key selector>).equalTo(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(3)))
    .apply (new JoinFunction () {...})

窗口范围(
A.ts在B.ts-X和B.ts+Y之间)
可以根据需要定义。

谢谢Fabian,DataStream API的示例代码是我需要的,但是对于Flink SQL,我需要的是您发布的DataStream API的替代版本,也就是说用TumblingEventTimeWindows连接三个表,请查看更新的问题。更清楚地说,我需要的是“事件时间翻转窗口流连接:连接位于同一翻转事件时间窗口中的两个流的元组”通过使用下面的Flink design文档中提到的Flink SQL,您可以使用UDF在SQL中实现这样的连接,UDF根据时间戳计算窗口ID,并连接该窗口ID上的流。但是,连接不会以流方式完成,并具体化所有输入表。Flink SQL还不能以流式方式进行连接。对不起,我弄糊涂了。你的意思是,即使我实现它“使用一个基于时间戳计算窗口ID并连接该窗口ID上的流的UDF”,但是这样的UDF仍然不能用滚动窗口样式连接两个流?这样的UDF可以用于连接表,但两个表都将在状态中完全物化。您需要定义状态保留时间来清除不再使用的状态。我建议在Flink用户邮件列表上继续讨论。所以这不是个合适的地方。
SELECT A.a, B.b, C.c
FROM A, B, C
WHERE A.x = B.x AND A.x = C.x AND
window(TumblingEventTimeWindows.of(Time.seconds(3))
firstStream
  .join(secondStream)
    .where(<key selector>).equalTo(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(3)))
    .apply (new JoinFunction () {...})
  .join(thirdStream)
    .where(<key selector>).equalTo(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(3)))
    .apply (new JoinFunction () {...})
SELECT A.a, B.b, C.c
  FROM A, B, C
  WHERE A.x = B.x AND A.x = C.x AND
        A.ts BETWEEN B.ts - INTERVAL '10' MINUTE AND B.ts + INTERVAL '10' MINUTE AND
        A.ts BETWEEN C.ts - INTERVAL '10' MINUTE AND C.ts + INTERVAL '10' MINUTE