乍一看,在我看来,使用KStream#reduceByKey
可以实现与KStream to KTable leftJoin
相同的功能。即将记录与相同的密钥组合。我在两者之间的差异,还是在表现方面?
答案 0 :(得分:3)
简答:(两者有什么区别?)
reduceByKey
适用于单一输入流,而leftJoin
合并两个流/表。
答案很长:
如果我正确理解了您的问题,那么您的传入KTable
更改日志流似乎是空的,并且您希望为每个传入的{计算新的连接结果(即更新结果KTable
) {1}}记录?连接的结果KStream
不可用作物化视图,但只有更改日志主题将在下游发送。因此,您的输入KTable
将始终为空,而您的输入KTable
记录将始终加入"没有" (因为左连接),这不会真正更新结果KStream
。您还可以执行KTable
- 如果您的输入KStream#map()
未提供状态,则无法利用该状态。
相反,如果您使用KTable
,则结果reduceByKey
可用作实体化视图,因此对于每个KTable
输入记录,可以使用先前的结果值进行更新。
因此,两种操作都有根本的不同。如果你有一个输入KStream
使用连接(需要两个输入)会很奇怪,因为没有KStream
......
答案 1 :(得分:1)
KStream表示每个记录都是自包含的记录流。例如,如果我们要总结单词出现次数,它将在某个帧(例如时间窗口或段落)期间保持计数。 KTable表示一种状态,并且每个记录进入,通常会保留总出现次数。 因此,使用每种方法的用例是完全不同的。虽然KStream #reduceByKey会减少同一密钥中的所有记录并汇总每个密钥的计数,但KTable #leadJoin通常用于需要根据其他信息调整总计数或将更多数据合并到记录。 Kafka Stream的文档中给出的示例用于日志压缩。使用KStream时,不会丢弃任何记录,在KTable中,将删除不再相关的记录。