任何人都知道如何使用时间偏移量来滚动窗口-窗口大小是一天,时间偏移量是基于时区的小时数。
我找到了使用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());
谢谢。
答案 0 :(得分:0)
不幸的是,无法在Table API / SQL中执行该窗口。现在,始终在UTC上以该API级别定义时间窗口。
可能的解决方法是改变源连接器中的时间,以使UTC窗口提供正确的结果。但是随后您需要在接收器连接器中将其反向移动。当然,只有在您不使用其他应用程序中的源代码的情况下,此hack才会起作用。