Flinkスクロールウィンドウ関数のオープンウィンドウ開始時間計算規則


結論:ウィンドウの開始時間は、必ずしも最も早い記録時間ではなく、計算された時間である.
Flinkのウィンドウ関数の開始時間計算式:
timestamp - (timestamp - offset + windowSize) % windowSize
# timestamp           
# offset        
# windowSize     
#                   

业务コード:.window(TumblingEventTimeWindows.of(Time.seconds(3L)))
スクロールウィンドウapi:TumblingEventTimeWindows of(Time size,Time offset)
ソース:
 :org.apache.flink.streaming.api.windowing.windows.TimeWindow
public static long getWindowStartWithOffset(long timestamp, long offset, long windowSize) {
	return timestamp - (timestamp - offset + windowSize) % windowSize;
}

offsetが入力されず、デフォルトが0の場合、開始時間はtimestamp-timestamp+windowsizeとwindowsizeの型取りであり、秒単位が小さいと仮定します.
入力時間が偶数秒T、windowsize長さが2 s、offsetが0の場合、型取り部分値が0を経て、開始時間がTとなります.
ウィジェットを書いて起動時間を計算します.
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class WindowStartTimeCalculate {

    public static void main(String[] args) throws Exception {
        String[] ss = {"2020-04-20 10:12:44", "2020-04-20 8:50:44", "2020-04-20 14:12:44", "2020-04-20 18:12:44", "2020-04-20 20:12:44"};
        for (String date : ss) {
            cac(Time.days(1L), date, Time.hours(16L));
        }
    }

    /**
     * @param w     
     * @param d     
     * @param o     
     * @throws Exception
     */
    public static void cac(Time w, String d, Time o) throws Exception {
        LocalDateTime parse = LocalDateTime.parse(d, DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss"));

        long timestamp = parse.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        long offset = o.toMilliseconds();
        long windowSize = w.toMilliseconds();

        long startTime = timestamp - (timestamp - offset + windowSize) % windowSize;
        System.out.println("offset:" + offset + ", windowSize: " + windowSize + ", " + startTime + "--" + LocalDateTime.ofInstant(Instant.ofEpochMilli(startTime), ZoneId.systemDefault()));
    }
}


ウィンドウ1日:
オフセット時間は記入しないで、それでは開始時間は:2020-04-20 T 08:00です
オフセット時間1時間hours(1 L)、それでは開始時間は2020-04-20 T 09:00です
順番に類推する...
オフセット時間が16時間の場合、開始時間は2020-04-20 T 00:00です.
オフセット時間23時間、開始時間は2020-04-20 T 07:00
 
ウィンドウ3 s、法則は明らかではなく、大部分は-1 sです.
offset:0, windowSize: 3000, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:00 offset:0, windowSize: 3000, record:2020-04-20 08:50:14 ,startTime:2020-04-20T08:50:12 offset:0, windowSize: 3000, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:36 offset:0, windowSize: 3000, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:48 offset:0, windowSize: 3000, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:48
ウィンドウ10 sでは、開始時間はイベント時間の桁数が0の時間で開始します.
offset:0, windowSize: 10000, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:00 offset:0, windowSize: 10000, record:2020-04-20 8:50:14 ,startTime:2020-04-20T08:50:10 offset:0, windowSize: 10000, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:30 offset:0, windowSize: 10000, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:40 offset:0, windowSize: 10000, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:50
ウィンドウ5秒:
offset:0, windowSize: 5000, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:00 offset:0, windowSize: 5000, record:2020-04-20 8:50:14 ,startTime:2020-04-20T08:50:10 offset:0, windowSize: 5000, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:35 offset:0, windowSize: 5000, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:45 offset:0, windowSize: 5000, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:50
ウィンドウが500ミリ秒、オフセットがNULLの場合、開始時間は最も早いレコードです.
offset:0, windowSize: 500, record:2020-04-20 10:12:01 ,startTime:2020-04-20T10:12:01 offset:0, windowSize: 500, record:2020-04-20 8:50:14 ,startTime:2020-04-20T08:50:14 offset:0, windowSize: 500, record:2020-04-20 14:12:37 ,startTime:2020-04-20T14:12:37 offset:0, windowSize: 500, record:2020-04-20 18:12:49 ,startTime:2020-04-20T18:12:49 offset:0, windowSize: 500, record:2020-04-20 20:12:50 ,startTime:2020-04-20T20:12:50