Java Apache flink-使用带有TimeCharacteristic.EventTime的TumblingProcessingTimeWindow

Java Apache flink-使用带有TimeCharacteristic.EventTime的TumblingProcessingTimeWindow,java,apache-flink,Java,Apache Flink,看起来TumblingProcessingTimeWindow总是使用“摄取时间”。 有没有办法强制在事件时间上打开窗口 我的用例非常简单,我接收到包含“事件时间戳”的事件,并希望它们基于事件时间进行聚合 例如,在以下代码中,我期望有2个输出: public class WindowExample { private static final SimpleDateFormat FORMAT = new SimpleDateFormat("HH:mm:ss"); public static v

看起来TumblingProcessingTimeWindow总是使用“摄取时间”。 有没有办法强制在事件时间上打开窗口

我的用例非常简单,我接收到包含“事件时间戳”的事件,并希望它们基于事件时间进行聚合

例如,在以下代码中,我期望有2个输出:

public class WindowExample {

private static final SimpleDateFormat FORMAT = new SimpleDateFormat("HH:mm:ss");

public static void main(String[] args) throws Exception {
    final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    DataStreamSource<Bean> beans = env.fromElements(
        new Bean(1, 1, "12:00:00"),
        new Bean(1, 2, "12:00:03"),
        new Bean(1, 1, "12:00:04"),  //window of 3 sec trigger here
        new Bean(1, 2, "12:00:05"),
        new Bean(1, 3, "12:00:06"),
        new Bean(1, 3, "12:00:07")   //window of 3 sec trigger here
    );

    beans.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<Bean>() {
        @Override public long extractAscendingTimestamp(Bean element) {
            return element.getTs();
        }
    })
        .keyBy("id")
        .window(TumblingProcessingTimeWindows.of(Time.seconds(3)))
        .max("value")
        .addSink(new SinkFunction<Bean>() {

            @Override public void invoke(Bean value, Context context) {
                System.out.println("Sync on: "+value);
            }
        });
    env.execute("Windowing test");
}

public static class Bean {

    private int id;
    private int value;
    private long ts;

    public Bean() {
    }

    Bean(int id, int value, String time) throws ParseException {
        this.id = id;
        this.value = value;
        this.ts = FORMAT.parse(time).toInstant().toEpochMilli();
    }

    long getTs() {
        return ts;
    }
    // other getters and setters
}
公共类窗口示例{
私有静态最终SimpleDataFormat格式=新SimpleDataFormat(“HH:mm:ss”);
公共静态void main(字符串[]args)引发异常{
最终StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
环境setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
DataStreamSource bean=env.fromElements(
新豆(1,1,“12:00:00”),
新豆(1,2,“12:00:03”),
新Bean(1,1,“12:00:04”),//这里触发3秒的窗口
新豆(1,2,“12:00:05”),
新豆(1,3,“12:00:06”),
新Bean(1,3,“12:00:07”)//这里触发3秒的窗口
);
assignTimestampandWatermarks(新的AscendingTimestampExtractor(){
@重写公共长提取AscendingTimeStamp(Bean元素){
return元素。getTs();
}
})
.keyBy(“id”)
.window(TumblingProcessingTimeWindows.of(Time.seconds(3)))
.max(“值”)
.addSink(新的SinkFunction(){
@重写公共void调用(Bean值、上下文){
System.out.println(“同步开启:+值”);
}
});
环境执行(“窗口测试”);
}
公共静态类Bean{
私有int-id;
私有int值;
私人长途电话;
公共豆(){
}
Bean(int-id、int-value、字符串时间)抛出ParseException{
this.id=id;
这个值=值;
this.ts=FORMAT.parse(time).toInstant().toEpochMilli();
}
朗格茨(){
返回ts;
}
//其他的接球手和二传手
}

}Flink允许将处理时间窗口与事件时间流一起使用,因为有合法的使用案例。但是如果您确实想要事件时间窗口,您需要请求它。在这种情况下,您应该使用
TumblingEventTimeWindows

“在下面的代码中,我希望有两个输出”——很抱歉,StackOverflow不是这样工作的。“这是我的一堆代码,它不起作用,有人能帮我弄明白”这样的问题被认为是离题的。您期望的具体输出是什么?你得到的是什么?你为什么认为这是不正确的?请访问并阅读更多信息,尤其是阅读感谢,我想我只是没有意识到我使用了错误的窗口。我还有一个与主题相关的问题,也许你可以马上回答:想象一下根据事件时间进行聚合,使用实时数据流-为具有特定密钥的事件生成的水印是否会触发windows上针对其他密钥的窗口操作?您应该为此新问题创建一个新的stackoverflow问题。