我目前有一个简单的数据流,例如:
|-----|--------|-------|
| Key | TS(ms) | Value |
|-----|--------|-------|
| A | 1000 | 0 |
| A | 1000 | 0 |
| A | 61000 | 0 |
| A | 61000 | 0 |
| A | 121000 | 0 |
| A | 121000 | 0 |
| A | 181000 | 10 |
| A | 181000 | 10 |
| A | 241000 | 10 |
| A | 241000 | 10 |
| B | 1000 | 0 |
| B | 1000 | 0 |
| B | 61000 | 0 |
| B | 61000 | 0 |
| B | 121000 | 0 |
| B | 121000 | 0 |
| B | 181000 | 10 |
| B | 181000 | 10 |
| B | 1000 | 10 |
| B | 241000 | 10 |
| B | 241000 | 10 |
|-----|--------|-------|
这也是我在主题中发布数据的顺序,该值实际上不是整数,而是avro值,但键是字符串。
我的代码是这样的:
KStream<Windowed<String>, Long> aggregatedStream = inputStream
.groupByKey()
.windowedBy(TimeWindows.of(Duration.ofMinutes(1)).grace(Duration.ZERO))
.count()
.toStream();
aggregatedStream.print(Printed.toSysOut());
print
的输出是:
[KTABLE-TOSTREAM-0000000003]: [A@0/60000], 1
[KTABLE-TOSTREAM-0000000003]: [A@0/60000], 2
[KTABLE-TOSTREAM-0000000003]: [A@60000/120000], 1
[KTABLE-TOSTREAM-0000000003]: [A@60000/120000], 2
[KTABLE-TOSTREAM-0000000003]: [A@120000/180000], 1
[KTABLE-TOSTREAM-0000000003]: [A@120000/180000], 2
[KTABLE-TOSTREAM-0000000003]: [A@180000/240000], 1
[KTABLE-TOSTREAM-0000000003]: [A@180000/240000], 2
[KTABLE-TOSTREAM-0000000003]: [A@240000/300000], 1
[KTABLE-TOSTREAM-0000000003]: [A@240000/300000], 2
[KTABLE-TOSTREAM-0000000003]: [B@240000/300000], 1
[KTABLE-TOSTREAM-0000000003]: [B@240000/300000], 2
宽限期似乎与流的密钥无关地全局适用,我希望(如果可能)取而代之的是接收密钥A的所有10个窗口计数和密钥B的10个窗口计数。 以某种方式,宽限期仅基于流的键关闭窗口。 有可能吗?
答案 0 :(得分:0)
grace
和suppress
似乎为每个分区使用了全局时间戳,因此每个键不可能有不同的时间戳。
相反,可以禁用宽限期并使用自定义转换器而不是常规的suppress
来通过按键进行抑制。