Apache kafka 卡夫卡流-在丰富流中添加消息频率

Apache kafka 卡夫卡流-在丰富流中添加消息频率,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,从一个流(k,v),我想计算一个流(k,(v,f)),其中f是给定密钥在过去n秒内出现的频率。 如果我使用窗口表格计算频率,请给出一个主题(t1): KTable<Windowed<Integer>,Long> t1_velocity_table = t1_stream.groupByKey().windowedBy(TimeWindows.of(n*1000)).count(); KTable t1_velocity_table=t1_stream.groupByKe

从一个流(k,v),我想计算一个流(k,(v,f)),其中f是给定密钥在过去n秒内出现的频率。 如果我使用窗口表格计算频率,请给出一个主题(t1):

KTable<Windowed<Integer>,Long> t1_velocity_table = t1_stream.groupByKey().windowedBy(TimeWindows.of(n*1000)).count();
KTable t1_velocity_table=t1_stream.groupByKey().windowedBy(TimeWindows.of(n*1000)).count();
这将提供一个带窗口的表,其中包含每个键的频率

假设我无法使用带窗口的键进行连接,而不是使用上面的表,我将流映射到具有简单键的表:

t1_Stream.groupByKey()
                .windowedBy(TimeWindows.of( n*1000)).count()
                .toStream().map((k,v)->new KeyValue<>(k.key(), Math.toIntExact(v))).to(frequency_topic);
KTable<Integer,Integer> t1_frequency_table = builder.table(frequency_topic);
t1_Stream.groupByKey()
.windowedBy(TimeWindows.of(n*1000)).count()
.toStream().map((k,v)->新键值(k.key(),Math.toIntExact(v)).to(频率主题);
KTable t1_frequency_table=builder.table(frequency_主题);
如果我现在在流中到达新键时在此表中查找,我如何知道是首先更新此查找表,还是首先发生联接(这将导致在记录中添加过时频率,而不是当前更新的频率)。创建流而不是表,然后进行窗口连接是否更好? 我想用如下内容查找表:

KStream<Integer,Tuple<Integer,Integer>> t1_enriched = t1_Stream.join(t1_frequency_table, (l,r) -> new Tuple<>(l, r));
KStream t1_experiment=t1_Stream.join(t1_frequency_table,(l,r)->新元组(l,r));
因此,不是只有一个(k,v)流,而是一个(k,(v,f))流,其中f是键k在最后n秒内的频率


有没有想过什么是实现这一目标的正确方法?谢谢

对于您共享的特定程序,将首先处理流侧记录。原因是,您通过一个主题传递数据

处理记录时,它将更新聚合结果,该聚合结果将发出一条写入直通主题的更新记录。之后,join操作符将直接处理该记录。只有在之后,一个新的
poll()
调用才会最终从through主题读取聚合结果,并更新联接的表端


使用DSL,似乎不可能实现您想要的。但是,您可以编写一个自定义的
转换器
,重新实现流表连接,以提供所需的语义。

我不确定是否可以遵循。你在说什么?还要注意的是,如果您的输入流包含无序数据,通过将窗口键向下剥离为普通键,您将得到不正确的结果…感谢Matthias,更新了更多详细信息。