我有一个记录流,它们被'两个字段'键入,然后分配了一个间隔为30秒的会话窗口。我使用附加到记录的“时间戳”作为事件时间。我正在使用'assignAscendingTimestamps'水印。
例如,考虑以下记录。流由(用户,地点)键入。
Record1:user1,place1,timestamp t1
Record2:user1,place1,t1后30秒的时间戳
Record3:user1,place1,时间戳在t1的30秒内
Record4:用户1,place1,t1后30秒的时间戳
Record2属于user2,因此它在键入流时属于不同的存储桶。因此我期待Record1,Record3和Record4属于一个存储桶而Record2属于另一个存储桶。
Bucket1
Record1:user1,place1,timestamp t1
Record3:user1,place1,时间戳在t1的30秒内
Record4 - user1,place1,t1后30秒的时间戳
Bucket2
Record2:user1,place1,t1后30秒的时间戳
根据我的理解,只有当Record4到达时才会触发包含Record1和Record3的会话窗口。但是当我运行代码时,Record2到达时会触发仅包含Record1的会话,因为Record2的时间戳是在Record1的时间戳的时间间隔(30秒)之后,尽管Record2的键是不同的。我浏览了Flink的文档以及我可以在线找到Session Windows的几个例子。但我无法解决这个问题。这里有什么我想念的吗?这可能是因为时间戳上升了水印吗?
答案 0 :(得分:4)
问题是assignAscendingTimestamps
要求您的时间戳在所有键上单调递增。原因是Flink无法生成每个关键水印。
由于Flink无法生成每个密钥水印,因此必须生成水印,使其对所有元素都有效。如果时间戳是每个键单调而不是所有键,则必须定义两个键之间的最大不按顺序(时间戳的差异)。通过从元素的时间戳中减去此不按顺序,您将获得有效的水印。另见BoundedOutOfOrdernessTimestampExtractor。但是,请注意,如果元素以较大的无序性到达,那么这也会破坏。