使用Kafka Streams在输出中设置时间戳

时间:2018-09-21 06:52:54

标签: apache-kafka apache-kafka-streams

我在Kafka主题“原始数据”中获取CSV,目的是通过发送带有正确时间戳(另一行不同)的另一主题“数据”中的每一行来转换它们。

当前,我有2条彩带:

  • 一个用于拆分“原始数据”中的行,将其发送到“内部”主题(无时间戳)
  • 带有TimestampExtractor且消耗“内部”并将其发送到“数据”的人。

我想通过直接设置时间戳来删除对“内部”主题的使用,但是我找不到办法(时间戳提取器仅在消耗时间使用)。

我在文档中偶然发现了这一行:

  

请注意,可以通过在调用#forward()时显式地将时间戳记分配给输出记录来在Processor API中更改描述的默认行为。

但是我找不到带有时间戳的签名。是什么意思?

你会怎么做?

编辑: 明确地说,我有一个Kafka主题,其中包含一条消息,其中包含事件时间和一些值,例如:

2018-01-01,hello 2018-01-02,world (这是一条消息,而不是两条消息)

我想在另一个主题中获得两条消息,并将Kafka记录时间戳记设置为其事件时间(2018-01-01和2018-01-02),而无需中间主题。

1 个答案:

答案 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()
      }
    }
  }
});