使用Table API或SQL的Apache Flink Tumbling Window时间偏移

时间:2019-11-18 01:38:30

标签: apache-flink

任何人都知道如何使用时间偏移量来滚动窗口-窗口大小是一天,时间偏移量是基于时区的小时数。

我找到了使用DataStream API进行操作的示例,想知道如何使用Table API / SQL实现它。

下面是我使用DataStream API的代码。

DataStream<Tuple2<String, Timestamp>> inputStreamWithTime = inputStream
.assignTimestampsAndWatermarks(new AssignerWithPunctuatedWatermarks<Tuple2<String, Timestamp>>() {
    @Override
    public long extractTimestamp(Tuple2<String, Timestamp> element, long previousElementTimestamp) {
        return element.f1.getTime();
    }

    @Override
    public Watermark checkAndGetNextWatermark(Tuple2<String, Timestamp> lastElement, long extractedTimestamp) {
        return new Watermark(extractedTimestamp);
    }
});

inputStreamWithTime
.keyBy(new KeySelector<Tuple2<String,Timestamp>, String>() {
    @Override
    public String getKey(Tuple2<String, Timestamp> in) throws Exception {
        return in.f0;
    }
})
.window(TumblingEventTimeWindows.of(Time.seconds(60L), Time.seconds(10L)))
.aggregate(new CountAggregate(), new ProcessTumblingWindowFunction())
.map((Tuple4<String, Long, Timestamp, Timestamp> value) -> {
    return new Tuple3<String, Long, Timestamp, Timestamp>(value.f0, value.f1, value.f2);
})
.returns(Types.TUPLE(Types.STRING, Types.LONG, Types.SQL_TIMESTAMP))
.addSink(getSink());

谢谢。

1 个答案:

答案 0 :(得分:0)

不幸的是,无法在Table API / SQL中执行该窗口。现在,始终在UTC上以该API级别定义时间窗口。

可能的解决方法是改变源连接器中的时间,以使UTC窗口提供正确的结果。但是随后您需要在接收器连接器中将其反向移动。当然,只有在您不使用其他应用程序中的源代码的情况下,此hack才会起作用。