据我了解,用于窗口聚合的更改日志主题应为每个窗口至少包含一个键/值?
input
.groupByKey() // group by user
.windowedBy(
TimeWindows
.of(Duration.ofSeconds(60))
.advanceBy(Duration.ofSeconds(10))
.grace(Duration.ofSeconds(60)))
.aggregate(
() -> new Aggregate(config),
(userId, msg, aggregate) -> aggregate.addAndReturn(msg),
Materialized
.<String, Aggregate>as(inMemoryWindowStore(
config.getOutputStore(),
Duration.ofSeconds(300),
Duration.ofSeconds(60),
false))
.withCachingDisabled()
.withKeySerde(Serdes.String())
.withValueSerde(new MyCustomSerde()));
查询状态存储时,我希望为每个窗口获取一个键/值:
WindowStoreIterator<Aggregate> iter = store.fetch(userId, start, end)
但是我什么也没得到(迭代器为空),或者有时它少于开始到结束之间的实际窗口数。
答案 0 :(得分:0)
您错误地使用了store.fetch(key, startTs, endTs)
的参数。两个时间戳startTs
和endTs
的确不是不是,是指单个窗口的开始/结束时间戳,但这是一个时间范围:{{1} }将返回所有包含时间范围内的开始时间戳的窗口。
老版本的JavaDocs不太好看,可能会导致误导。较新的版本改进了JavaDocs:https://kafka.apache.org/23/javadoc/org/apache/kafka/streams/state/ReadOnlyWindowStore.html
请注意,参数类型已更改并在较新版本中重命名:
fetch()