Java KStream join立即启动join函数,如何在窗口结束时延迟它?

Java KStream join立即启动join函数,如何在窗口结束时延迟它?,java,join,spark-streaming,apache-kafka-streams,Java,Join,Spark Streaming,Apache Kafka Streams,正如综合文章中所解释的。外部KStream KStream Join在元素到达时立即发出元素,甚至在等待它在另一个K流中的匹配之前。这样做的缺点是,它会将未加入的事件与每个加入的事件一起复制 您能否建议任何替代方法来实现事件的连接,而不重复(如外部连接)或丢失(如内部连接) 根据相同的单击查看事件示例: KStream joinedeventstream= 单击事件流。外部连接(查看事件流, (clickEvent,viewEvent)->processJoin(clickEvent,view

正如综合文章中所解释的。外部KStream KStream Join在元素到达时立即发出元素,甚至在等待它在另一个K流中的匹配之前。这样做的缺点是,它会将未加入的事件与每个加入的事件一起复制

您能否建议任何替代方法来实现事件的连接,而不重复(如外部连接)或丢失(如内部连接)


根据相同的单击查看事件示例:

KStream joinedeventstream=
单击事件流。外部连接(查看事件流,
(clickEvent,viewEvent)->processJoin(clickEvent,viewEvent),/*如果找到匹配项,则快速激发*/
/*否则2秒后开火*/
JoinWindows.of(Duration.ofSeconds(2L)),streamjoind.with(Serdes.String(),jsonSerde,jsonSerde)
);
预期结果解释如下:

  • 点击事件在查看加入的事件(a,a)后1秒到达
  • 点击事件在查看后11秒到达-每个点击事件都有不同的事件。每次到达后2秒(窗口大小)后。(B,空)(空,B)
  • 点击连接事件(C,C)后1秒,视图事件到达
  • 有一个查看事件,但没有点击-到达2秒后未加入事件(D,null)
  • 有一个点击事件,但没有视图-到达2秒后未加入事件(null,E)

Atm(卡夫卡2.7.0)该行为如博客文章所述。这个问题已经出现过多次,我们最近创建了一个记录单来更改行为:

在Atm中,您可以在连接后使用下游有状态操作来缓冲记录,直到到达窗口结束(或者更好,窗口关闭,即窗口结束加上宽限期)。这允许您过滤掉虚假的左/外连接结果。

页面的最后一段说,kafka streams不支持这一点!
KStream<String, JsonNode> joinedEventsStream = 
     clickEventsStream.outerJoin(viewEventsStream,
            (clickEvent, viewEvent) -> processJoin(clickEvent, viewEvent),/* Fire quickly if match found,*/
                                                                          /* else fire after 2 seconds */
            JoinWindows.of(Duration.ofSeconds(2L)), StreamJoined.with(Serdes.String(), jsonSerde, jsonSerde)
    );