我目前在时间窗口的Flink应用程序上运行可查询状态,该应用程序根据是否在最后一分钟看到了一个事务而返回true或false . 我似乎不能在Windowed State上使用可查询状态,只能在Global State上使用它 .
当我使用全局状态时,我能够很好地访问我的布尔值Value,但是我想使用窗口状态,因为存储在状态中的值应该在一定时间后过期 .
Process Function Code:
if(!valueStateDescriptor.isQueryable())
valueStateDescriptor.setQueryable("query");
exists = context.globalState().getState(valueStateDescriptor);
for (Data data: iterable) {
exists.update(true);
System.out.println(exists.value());
collector.collect(data);
}
当我使用我的查询客户端时,当我将 context.globalState()
切换到 context.windowState()
时,我得到了 .
java.lang.RuntimeException:无法查询查询的状态后端2.引起:java.io.IOException:无法反序列化键和命名空间 . 这表示KvState实例和此访问使用的键/命名空间序列化程序不匹配 .
我试图修改现有的状态我实现了我的窗口的“清除”触发器,但它没有修改我的可查询客户端的结果 .
@Override
public void clear(TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
System.out.println("clear");
triggerContext.getPartitionedState(valueStateDescriptor).update(false);
}
有没有办法利用窗口触发器使窗口状态失效? (我相信窗口状态将为我处理这个问题)我可以使用窗口状态而不是全局状态用于可查询状态吗?