是否有一种Kafka流方法,可以在更改数字时将数字流减少为仅“输出”

时间:2019-10-18 08:04:38

标签: apache-kafka reduce apache-kafka-streams

我正在尝试使用Kafka Steam来减少一系列数字,并且我只想在数据更改时进行记录。它可以完美运行,但是问题是,如果运行代码的服务已关闭,它就不会赶上kafka的数据。所以我猜解决方案是错误的? 我的代码:

KGroupedStream<String, JsonNode> groupedStream = filteredStream.groupByKey( Serdes.String(), jsonSerde);
KTable<String, JsonNode> reducedTable = groupedStream.reduce(
                (aggValue, newValue) ->  Calculate.newValue( newValue, aggValue, logger) ,/* adder */
                "reduced-stream-store" /* state store name */);
KStream<String, JsonNode> reducedStream =  reducedTable.toStream();

“计算”方法:

if (value != oldValue)
 return value
else return  null.

如果有评论/建议,谢谢

1 个答案:

答案 0 :(得分:0)

您代码中的

return null将删除结果表中的条目。因此,您的代码无法达到您的期望。

实际上,DSL运营商发出的是“更新时”而不是“变更时”,因此您不能将DSL用于您的用例。有一张票证建议添加“变化时发出”的语义(https://issues.apache.org/jira/browse/KAFKA-8770)。

作为一种解决方法,您将需要使用带有状态存储的自定义transform()。对于每个输入记录,您检查它是否存在于商店中。如果否,则发出记录并将其放入存储中。如果if存在并且相同,则不发出任何东西。如果不同,则发出并更新商店。