Flink入门(十六) State

Flink的state主要是有两种:

  • Keyed State
    主要依赖于KeyedStream
  • Operator State
    non-keyed state

这两种存在于两种形式:

  • Managed State(由flink-runtime控制的结构化数据)
  • Raw State。

举例说明Managed State使用方法。

//用户点击方案的事件操作
DataStream<ItemIdClickedBO> itemClickedStream  。。。。

ItemIdClickedBO类为

import lombok.Builder;
import lombok.Data;
@Builder
@Data
public class ItemIdClickedBO {

    private String unionId;//用户唯一标识符

    private String itemId;//方案唯一标识符
	。。。
}

需求,统计过去十分钟,用户点击方案的list集合。

//用户最近10分钟,点击过方案
DataStream<Tuple2<String, List<String>>> userClickStream = itemClickedStream.keyBy(ItemIdClickedBO::getUnionId).map(new UserLatestClickItemIdState());

UserLatestClickItemIdState函数为

import com.google.common.collect.Lists;
import com.tc.flink.analysis.label.output.ItemIdClickedBO;
import org.apache.flink.api.common.functions.RichMapFunction;
import org.apache.flink.api.common.state.ListState;
import org.apache.flink.api.common.state.ListStateDescriptor;
import org.apache.flink.api.common.state.StateTtlConfig;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;

import java.util.List;

public class UserLatestClickItemIdState extends RichMapFunction<ItemIdClickedBO, Tuple2<String, List<String>>> {
    
    private transient ListState<String> merges;

    @Override
    public void open(Configuration parameters) throws Exception {
        StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.minutes(10)).setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite).setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired).build();
        ListStateDescriptor<String> descriptor = new ListStateDescriptor<String>("user_latest_click", String.class);
        descriptor.enableTimeToLive(ttlConfig);
        merges = getRuntimeContext().getListState(descriptor);
        super.open(parameters);
    }

    @Override
    public Tuple2<String, List<String>> map(ItemIdClickedBO value) throws Exception {
        merges.add(value.getItemId());
        return  Tuple2.of(value.getUnionId(), Lists.newArrayList(merges.get()));
    }
}

StateTtlConfig设置10分钟TTL,我这里采用ListState满足需求,
从代码来看,还是简单的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值