Kafka Streams子会话:按数据子集进行会话并聚合回来

时间:2018-11-12 14:41:58

标签: apache-kafka apache-kafka-streams

我想使用原始密钥为(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]] )
  1. 我已经进行了一些测试。第二个toStream被调用(我在foreach打印机上进行了测试),但是第二个聚合方法从未被调用。为什么?

  2. 第二个窗口真的有用吗? DSL构建的ReadOnlySessionStore生成Windowed密钥,但不允许按时间查询,因此检索将包括获取密钥的所有记录,并对其进行迭代以找到满足时间限制查询的记录。

  3. 关于效率,这里还有两个分区:(a) -> (a,b),然后是(a,b) -> (a)。仅靠a进行的会话就不需要重新分区-但我必须在代码中进行(a,b)的会话...我认为这是可行的,但是我想在这里利用KafkaStreams自身的会话功能。有更好的方法吗?

0 个答案:

没有答案