我想使用原始密钥为(a,b)
的流中的窗口通过a
进行会话,但是将通过(a,b)
进行会话,b
是该值的结果。
我通过做类似的事情来得到它:
val storeByAB = builder.
stream("topicname").
groupBy((k, v) => new ABKey(k.a, v.getB())).
windowedBy(mySessionWindows).
aggregate(... aggregate into a List[Session])
聚合会生成丰富的会话列表(有时,自然会话可能必须分成多个会话)。
从那里,通过(a,b)
获得会话后,我想重新合并SessionStore中的所有会话,以便可以实现它并通过原始键a
查询会话,然后结果得到Map[ABKey, List[Session]]
。
val storeByA = sessionStore.toStream.
groupBy((k, v) => new AKey(k.key().a)).
windowedBy(mySessionWindows).
aggregate(... aggregate into a Map[AB -> List[Session]] )
我已经进行了一些测试。第二个toStream
被调用(我在foreach
打印机上进行了测试),但是第二个聚合方法从未被调用。为什么?
第二个窗口真的有用吗? DSL构建的ReadOnlySessionStore
生成Windowed
密钥,但不允许按时间查询,因此检索将包括获取密钥的所有记录,并对其进行迭代以找到满足时间限制查询的记录。
关于效率,这里还有两个分区:(a) -> (a,b)
,然后是(a,b) -> (a)
。仅靠a
进行的会话就不需要重新分区-但我必须在代码中进行(a,b)
的会话...我认为这是可行的,但是我想在这里利用KafkaStreams自身的会话功能。有更好的方法吗?