Flink-按键分区状态-值状态(ValueState)

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("........");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值