Flink-按键分区状态-值状态(ValueState)
代码来自尚硅谷的课件资料
一、在open方法中,初始化状态。
1.首先创建了stateTtlConfig.
StateTtlConfig.Builder (Time.days (1)) 设置过期时间为1天
setUpdateType (StateTtlConfig.UpdateType.OnCreateAndWrite) 状态的创建和写入来更新过期时间
2.状态描述器,启动TTL
new ValueStateDescriptor<> ("last-cart", String.class); 状态描述器两个参数:第一个参数,起个名字,不重复;第二个参数,存储的类型
getRuntimeContext()获取当前的运行时上下文(RuntimeContext),进而获取到访问状态的句柄
二、状态的获取与更新。
1.value () 获取当前状态的值
2.update ()来更新状态值
SingleOutputStreamOperator<CartAddUuBean> cartAddDS = keyedStream.flatMap (new RichFlatMapFunction<JSONObject, CartAddUuBean> () {
private ValueState<String> lastCartAddState;
@Override
public void open(Configuration parameters) throws Exception {
//
StateTtlConfig ttlConfig = new StateTtlConfig.Builder (Time.days (1))
.setUpdateType (StateTtlConfig.UpdateType.OnCreateAndWrite)
.build ();
ValueStateDescriptor<String> stateDescriptor = new ValueStateDescriptor<> ("last-cart", String.class);
stateDescriptor.enableTimeToLive (ttlConfig);
lastCartAddState = getRuntimeContext ().getState (stateDescriptor);
}
@Override
public void flatMap(JSONObject value, Collector<CartAddUuBean> out) throws Exception {
//获取状态数据以及当前数据的日期
String lastDt = lastCartAddState.value ();
String operateTime = value.getString ("operate_time");
String curDt = null;
if (operateTime != null) {
curDt = operateTime.split (" ")[0];
} else {
String createTime = value.getString ("create_time");
curDt = createTime.split (" ")[0];
}
if (lastDt == null || !lastDt.equals (curDt)) {
lastCartAddState.update (curDt);
out.collect (new CartAddUuBean (
"",
"",
1L,
null));
}
}
});
cartAddDS.print("........");

897

被折叠的 条评论
为什么被折叠?



