将两个从TimeWindows派生的KTable合并在一起时,TimeWindows是否应该相同

时间:2019-06-20 15:00:06

标签: apache-kafka-streams

我为两个不同的KTable使用两个不同的保留时间,并且它与RocksDB状态和changelog Kafka主题一起使用。

KTable由KStream和groupBy然后由windowedBy生成。

我相信将KStream与窗口一起加入时,TimeWindows是相同的。我想知道在加入两个由TimeWindows窗口化的不同KTable时,TimeWindows参数是否有所不同?

代码段:

final KStream<Integer, String> eventStream = builder.stream("events",
                        Consumed.with(Serdes.Integer(), Serdes.String())
                                .withOffsetResetPolicy(Topology.AutoOffsetReset.EARLIEST));

final KTable<Windowed<Integer>, String> eventWindowTable = eventStream.groupByKey()
                .windowedBy(TimeWindows.of(Duration.ofSeconds(60)).until(Duration.ofSeconds(100).toMillis()))
                .reduce((oldValue, newValue) -> newValue);

final KStream<Integer, String> clickStream = builder.stream("clicks",
                Consumed.with(Serdes.Integer(), Serdes.String())
                        .withOffsetResetPolicy(Topology.AutoOffsetReset.EARLIEST));

final KTable<Windowed<Integer>, String> clickWindowTable = clickStream.groupByKey()
                .windowedBy(TimeWindows.of(Duration.ofSeconds(30)).until(Duration.ofSeconds(70).toMillis()))
                .reduce((oldValue, newValue) -> newValue);

final KTable<Windowed<Integer>, String> join = eventWindowTable.leftJoin(clickWindowTable,
                (event, click) -> event + " ; " + click + " ; " + Instant.now()
        );

最初,我认为使用不同的TimeWindows参数连接两个不同的KTable将不起作用,因为该连接依赖于TimeWindowedKey(该时隙的键)。但是经过测试,它也可以正常工作。

1 个答案:

答案 0 :(得分:0)

执行联接是因为两个键的 type 相同:Windowed<Integer>。当然,只有键相同时,联接才会产生结果。假设您具有以下窗口(请注意,TimeWindows仅存储了窗口开始时间戳):

eventWindowTable: <A,0>        <A,60>       

clickWindowTable: <A,0> <A,30> <A,60> <A,90>

在这种情况下,仅<A,0><A,60>将加入。因此,拥有不同的窗口会影响您的结果,因为窗口开始时间戳是键的一部分,并且某些窗口将永远不会加入(例如,在我们的示例中,<A,30><A,90>)。