Apache flink 使用表API或SQL的Apache Flink翻滚窗口时间偏移

Apache flink 使用表API或SQL的Apache Flink翻滚窗口时间偏移,apache-flink,Apache Flink,任何人都知道如何使用时间偏移进行翻滚窗口-窗口大小为一天,时间偏移基于时区以小时为单位 我找到了使用DataStream API实现它的示例,想知道如何使用表API/SQL实现它 下面是我使用DataStream API的代码 DataStream<Tuple2<String, Timestamp>> inputStreamWithTime = inputStream .assignTimestampsAndWatermarks(new AssignerWithPunct

任何人都知道如何使用时间偏移进行翻滚窗口-窗口大小为一天,时间偏移基于时区以小时为单位

我找到了使用DataStream API实现它的示例,想知道如何使用表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());
数据流inputStreamWithTime=inputStream .assignTimestampsAndWatermarks(新的AssignerWithsportedWatermarks(){ @凌驾 公共长提取时间戳(Tuple2元素,长previousElementTimestamp){ 返回元素.f1.getTime(); } @凌驾 公共水印检查和获取下一个水印(Tuple2 lastElement,长提取时间戳){ 返回新水印(提取的时间戳); } }); 随时间输入流 .keyBy(新的KeySelector(){ @凌驾 公共字符串getKey(中的Tuple2)引发异常{ 返回in.f0; } }) .window(tumblingeventimewindows.of(时间秒(60升),时间秒(10升))) .aggregate(新CountAggregate(),新ProcessTumblingWindowFunction()) .map((Tuple4值)->{ 返回新的Tuple3(value.f0、value.f1、value.f2); }) .returns(Types.TUPLE(Types.STRING、Types.LONG、Types.SQL\u TIMESTAMP)) .addSink(getSink());
提前感谢。

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

一种可能的解决方法是在源连接器中移动时间,以便UTC窗口提供正确的结果。但是,您需要在接收器连接器中反向移动它。当然,只有在您不在另一个应用程序中使用源代码的情况下,这种攻击才会起作用