2

乍一看,在我看来,使用KStream#reduceByKeyone 可以实现与使用KStream to KTable leftJoin. 即用相同的键组合记录。在性能方面,两者之间有什么区别?

4

2 回答 2

3

简短回答:(两者有什么区别?)

reduceByKey应用于单个输入流,同时leftJoin结合两个流/表

长答案:

如果我正确理解您的问题,您的传入更改日志流似乎是空的,并且您想为每个传入记录KTable计算一个新的连接结果(即更新结果)?连接的结果不能作为物化视图使用,但只有更改日志主题将被发送到下游。因此,您的输入将始终为空,并且您的输入记录将始终与“无”连接(因为左连接),这实际上不会更新结果。你也可以做一个——如果你的输入没有提供一个状态,你就没有可以利用的状态。KTableKStreamKTableKTableKStreamKTableKStream#map()KTable

相反,如果使用reduceByKey,则结果KTable可用作物化视图,因此对于每个KStream输入记录,先前的结果值都可用于更新。

因此,这两种操作是根本不同的。如果你有一个KStream使用连接的输入(需要两个输入)会很奇怪,因为没有KTable......

于 2016-09-12T22:25:21.480 回答
1

KStream 表示一个记录流,其中每个记录都是自包含的。例如,如果我们要总结单词出现,它会在某个帧(例如时间窗口或段落)内保持计数。KTable 代表一种状态,每条进入的记录通常会保存总出现次数。因此,使用每种方法的用例是完全不同的。虽然 KStream#reduceByKey 会减少同一键中的所有记录并汇总每个键的计数,但 KTable#leftJoin 通常用于需要根据传入的其他信息调整总计数或将更多数据组合到记录。Kafka Stream 文档中给出的示例用于日志压缩。使用 KStream 时,不会丢弃任何记录,在 KTable 中,

于 2016-09-12T08:06:34.607 回答