Java Flink DataStream API中的TimeWindow.getStart()存在问题

Java Flink DataStream API中的TimeWindow.getStart()存在问题,java,apache-flink,Java,Apache Flink,当我使用ProcessWindow函数时,如下所示: private static class pwf extends ProcessWindowFunction<String, Tuple3<String, String,String>, Tuple, TimeWindow> {//IN, OUT, KEY, W public void process(Tuple key, Context

当我使用ProcessWindow函数时,如下所示:

    private static class pwf
        extends ProcessWindowFunction<String, Tuple3<String, String,String>, Tuple, TimeWindow> {//IN, OUT, KEY, W
    public void process(Tuple key,
                        Context context,
                        Iterable<String> elements,
                        Collector<Tuple3<String, String,String>> out) {
        String res = elements.iterator().next();
        out.collect(new Tuple3<String,String,String>(String.valueOf((context.window().getStart())),(String)((Tuple1)key).f0, res));
    }
}
专用静态类pwf
扩展ProcessWindowFunction{//IN,OUT,KEY,W
公共作废过程(元组键,
语境,
可替代元素,
收集器(输出){
String res=elements.iterator().next();
collect(新的Tuple3(String.valueOf((context.window().getStart()),(String)((Tuple1)key.f0,res));
}
}
我有一个这样的开始时间:1691580000,1691640000,但我不能理解这种形式,有人能给我一些建议吗?任何答案都将不胜感激

整个代码可能会有所帮助:

DataStream<RawLogGroupList> sourceStream = env.addSource(new FlinkLogConsumer<RawLogGroupList>(deserializer, configProps));
        DataStream<Tuple3<String,String,String>> resStream = sourceStream
                .flatMap(new FlatMapFunction<RawLogGroupList, RawLog>() {
                    @Override
                    public void flatMap(RawLogGroupList value, Collector<RawLog> out) throws Exception {
                        for (RawLogGroup logGroup : value.getRawLogGroups()) {
                            for (RawLog log : logGroup.getLogs()) {
                                out.collect(log);
                            }
                        }
                    }
                })
                .setParallelism(flatmapParallelism)
                .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<RawLog>(Time.seconds(30)) {
                    @Override
                    public long extractTimestamp(RawLog element) {
                        return element.getTime()*1000;
                    }
                }).setParallelism(mapParallelism)
                .map(new MapFunction<RawLog, Tuple3<String,String,Long>>() {
                    @Override
                    public Tuple3<String,String,Long> map(RawLog value) throws Exception {
                        Map<String,String> contents = value.getContents();
                        return new Tuple3<>(
                                contents.getOrDefault("logtime","nullFromMap"),
                                contents.getOrDefault("method","nullFromMap"),
                                Long.valueOf(contents.getOrDefault("latency","0"))
                        );
                    }
                }).setParallelism(mapParallelism)
                .keyBy(1)
                .timeWindow(Time.seconds(60))
                .aggregate(new Med(),new pwf())
                .setParallelism(aggregateParallelism)
            .returns(Types.TUPLE(Types.STRING,Types.STRING,Types.STRING));
DataStream sourceStream=env.addSource(新的FlinkLogConsumer(反序列化器,configProps));
DataStream resStream=sourceStream
.flatMap(新的flatMap函数(){
@凌驾
公共void flatMap(RawLogGroupList值,收集器输出)引发异常{
for(RawLogGroup logGroup:value.getRawLogGroups()){
for(RawLog日志:logGroup.getLogs()){
取出。收集(日志);
}
}
}
})
.setParallelism(flatmapParallelism)
.assignTimestampsAndWatermarks(新的BoundedAutofordernessTimestampExtractor(时间.秒(30)){
@凌驾
公共长提取时间戳(RawLog元素){
return元素.getTime()*1000;
}
}).setParallelism(mapParallelism)
.map(新的映射函数(){
@凌驾
公共Tuple3映射(RawLog值)引发异常{
映射内容=value.getContents();
返回新的Tuple3(
contents.getOrDefault(“logtime”、“nullFromMap”),
getOrDefault(“方法”,“nullFromMap”),
Long.valueOf(contents.getOrDefault(“延迟”,“0”))
);
}
}).setParallelism(mapParallelism)
.keyBy(1)
.时间窗口(时间.秒(60))
.聚合(新Med(),新pwf())
.setParallelism(聚合并行)
.returns(Types.TUPLE(Types.STRING,Types.STRING,Types.STRING));

这些数字是时间戳

弗林克支持不同的时间观念;特别是处理时间和事件时间(以及摄取时间)。Processing time是处理事件时的系统时间。事件时间是指事件中编码的时间戳

如果您使用的是处理时间,那么这些将是unix时间戳(以毫秒为单位),就像从
System.currentTimeMillis()
返回的一样

如果您使用的是事件时间,那么时间戳只是数字,它们具有应用程序与之关联的任何含义,尽管通常它们也被编码为自纪元起的毫秒(就像
System.currentTimeMillis()

在您的例子中,这些似乎是以秒为单位的unix时间戳,但日期是2023年,这似乎很奇怪。169158000是2023年8月9日下午1:20:00

如果这些时间戳没有意义,可能是您的计算机出现了问题


请参阅文档。

这些数字是时间戳

弗林克支持不同的时间观念;特别是处理时间和事件时间(以及摄取时间)。Processing time是处理事件时的系统时间。事件时间是指事件中编码的时间戳

如果您使用的是处理时间,那么这些将是unix时间戳(以毫秒为单位),就像从
System.currentTimeMillis()
返回的一样

如果您使用的是事件时间,那么时间戳只是数字,它们具有应用程序与之关联的任何含义,尽管通常它们也被编码为自纪元起的毫秒(就像
System.currentTimeMillis()

在您的例子中,这些似乎是以秒为单位的unix时间戳,但日期是2023年,这似乎很奇怪。169158000是2023年8月9日下午1:20:00

如果这些时间戳没有意义,可能是您的计算机出现了问题


请参阅文档。

最后我发现了问题:
由于element.getTime()返回一个表示时间戳的int,“element.getTime()*1000”将导致int溢出,因此我无法获得正确的时间戳

最后我发现了问题:
由于element.getTime()返回一个表示时间戳的int,“element.getTime()*1000”将导致int溢出,因此我无法获得正确的时间戳

谢谢你的回答!问题只是时间戳,我的窗口是1分钟,两个连续窗口的实际间隔是这样的:TimeWindow{start=1695780000,end=1695840000}TimeWindow{start=1695840000,end=1695900000}TimeWindow{start=1695900000,end=1695960000}这稍微澄清了一些事情。您的时间戳以毫秒为单位。第一个窗口开始于零下19天左右,fwiw。那么我应该怎么做才能显示正确的窗口时间呢?我试图删除“element.getTime()*1000”中的“*1000”,但仍然不起作用……窗口时间来自事件中的时间戳。您必须追踪事件时间戳的来源。thx为您提供答案!问题只是时间戳,我的窗口是1分钟,两个连续窗口的实际间隔是这样的:TimeWindow{start=1695780000,end=1695840000}TimeWindow{start=1695840000,end=1695900000}TimeWindow{start=1695900000,end=1695960000}这稍微澄清了一些事情。您的时间戳以毫秒为单位