我在Kafka主题“原始数据”中获取CSV,目的是通过发送带有正确时间戳(另一行不同)的另一主题“数据”中的每一行来转换它们。
当前,我有2条彩带:
TimestampExtractor
且消耗“内部”并将其发送到“数据”的人。我想通过直接设置时间戳来删除对“内部”主题的使用,但是我找不到办法(时间戳提取器仅在消耗时间使用)。
我在文档中偶然发现了这一行:
请注意,可以通过在调用#forward()时显式地将时间戳记分配给输出记录来在Processor API中更改描述的默认行为。
但是我找不到带有时间戳的签名。是什么意思?
你会怎么做?
编辑: 明确地说,我有一个Kafka主题,其中包含一条消息,其中包含事件时间和一些值,例如:
2018-01-01,hello
2018-01-02,world
(这是一条消息,而不是两条消息)
我想在另一个主题中获得两条消息,并将Kafka记录时间戳记设置为其事件时间(2018-01-01和2018-01-02),而无需中间主题。
答案 0 :(得分:2)
设置输出时间戳需要Kafka Streams 2.0,并且仅在Processor API中受支持。如果使用DSL,则可以使用transform()
来使用这些API。
如您所指出的,您将使用context.forward()
。呼叫将是:
stream.transform(new TransformerSupplier() {
public Transformer get() {
return new Transformer() {
// omit other methods for brevity
// you need to get the `context` from `init()`
public KeyValue transform(K key, V value) {
// some business logic
// you can call #forward() as often as you want
context.forward(newKey, newValue, To.all().withTimestamp(newTimestamp));
return null; // only return data via context#forward()
}
}
}
});