如何处理卡夫卡流中的不同时区?

时间:2019-01-28 04:15:47

标签: java apache-kafka apache-kafka-streams

所以我正在评估Kafka Streams,以及如何做才能查看它是否适合我的用例,因为我需要每小时,每天,每天15分钟汇总传感器数据,并发现它具有窗口功能,因此很有用。 因为我可以通过在windowedBy()上应用KGroupedStream来创建窗口,但是问题是窗口是在UTC中创建的,我希望我的数据按其原始时区而不是UTC时区进行分组,因为这样会妨碍聚合,因此谁能帮我这个忙。

2 个答案:

答案 0 :(得分:1)

您可以使用自定义TimestampExtractor“移动”时间戳-在将结果写回到输出主题之前,您可以使用Transformer并通过{{”移动“时间戳” 1}}。

功能请求票证:https://issues.apache.org/jira/browse/KAFKA-7911

答案 1 :(得分:0)

因此,为了解决此问题,我创建了自定义TimestampExtractor,并使用它来更改流窗口创建时间以记录有效负载中的时间,如下所示。

public class RecordTimeStampExtractor implements TimestampExtractor {

    @Override
    public long extract(ConsumerRecord<Object, Object> record, long previousTimestamp) {
        JsonObject data = (JsonObject) new JsonParser().parse(record.value().toString());
        Timestamp recordTimestamp = Timestamp.valueOf(data.get(Constant.SLOT).getAsString());
        return recordTimestamp.getTime();
    }

}

因此,现在我从昨天起就是IST 05:30,已经在我的本地时区进行了测试,并且它的正常运行以及kafka流正在基于记录时间戳创建窗口。还将与其他时区进行测试并更新答案