Apache flink 使用表API或SQL的Apache Flink翻滚窗口时间偏移
任何人都知道如何使用时间偏移进行翻滚窗口-窗口大小为一天,时间偏移基于时区以小时为单位 我找到了使用DataStream API实现它的示例,想知道如何使用表API/SQL实现它 下面是我使用DataStream API的代码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<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窗口提供正确的结果。但是,您需要在接收器连接器中反向移动它。当然,只有在您不在另一个应用程序中使用源代码的情况下,这种攻击才会起作用