当前位置: 首页 > article >正文

大数据学习(49) - Flink按键分区状态(Keyed State)

&&大数据学习&&

🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


按键分区状态(Keyed State)顾名思义,是任务按照键(key)来访问和维护的状态。它的特点非常鲜明,就是以key为作用范围进行隔离。

需要注意,使用Keyed State必须基于KeyedStream。没有进行keyBy分区的DataStream,即使转换算子实现了对应的富函数类,也不能通过运行时上下文访问Keyed State。

1 值状态(ValueState)

顾名思义,状态中只保存一个“值”(value)。ValueState<T>本身是一个接口,源码中定义如下:

public interface ValueState<T> extends State {

    T value() throws IOException;

    void update(T value) throws IOException;

}

这里的T是泛型,表示状态的数据内容可以是任何具体的数据类型。如果想要保存一个长整型值作为状态,那么类型就是ValueState<Long>。

我们可以在代码中读写值状态,实现对于状态的访问和更新。

  1. T value():获取当前状态的值;
  2. update(T value):对状态进行更新,传入的参数value就是要覆写的状态值。

在具体使用时,为了让运行时上下文清楚到底是哪个状态,我们还需要创建一个“状态描述器”(StateDescriptor)来提供状态的基本信息。例如源码中,ValueState的状态描述器构造方法如下:

public ValueStateDescriptor(String name, Class<T> typeClass) {

    super(name, typeClass, null);

}

这里需要传入状态的名称和类型——这跟我们声明一个变量时做的事情完全一样。

2 列表状态(ListState)

将需要保存的数据,以列表(List)的形式组织起来。在ListState<T>接口中同样有一个类型参数T,表示列表中数据的类型。ListState也提供了一系列的方法来操作状态,使用方式与一般的List非常相似。

  1. Iterable<T> get():获取当前的列表状态,返回的是一个可迭代类型Iterable<T>;
  2. update(List<T> values):传入一个列表values,直接对状态进行覆盖;
  3. add(T value):在状态列表中添加一个元素value;
  4. addAll(List<T> values):向列表中添加多个元素,以列表values形式传入。

类似地,ListState的状态描述器就叫作ListStateDescriptor,用法跟ValueStateDescriptor完全一致。

3 Map状态(MapState)

把一些键值对(key-value)作为状态整体保存起来,可以认为就是一组key-value映射的列表。对应的MapState<UK, UV>接口中,就会有UK、UV两个泛型,分别表示保存的key和value的类型。同样,MapState提供了操作映射状态的方法,与Map的使用非常类似。

  1. UV get(UK key):传入一个key作为参数,查询对应的value值;
  2. put(UK key, UV value):传入一个键值对,更新key对应的value值;
  3. putAll(Map<UK, UV> map):将传入的映射map中所有的键值对,全部添加到映射状态中;
  4. remove(UK key):将指定key对应的键值对删除;
  5. boolean contains(UK key):判断是否存在指定的key,返回一个boolean值。

另外,MapState也提供了获取整个映射相关信息的方法;

  1. Iterable<Map.Entry<UK, UV>> entries():获取映射状态中所有的键值对;
  2. Iterable<UK> keys():获取映射状态中所有的键(key),返回一个可迭代Iterable类型;
  3. Iterable<UV> values():获取映射状态中所有的值(value),返回一个可迭代Iterable类型;
  4. boolean isEmpty():判断映射是否为空,返回一个boolean值。

4 归约状态(ReducingState)

类似于值状态(Value),不过需要对添加进来的所有数据进行归约,将归约聚合之后的值作为状态保存下来。ReducingState<T>这个接口调用的方法类似于ListState,只不过它保存的只是一个聚合值,所以调用.add()方法时,不是在状态列表里添加元素,而是直接把新数据和之前的状态进行归约,并用得到的结果更新状态。

归约逻辑的定义,是在归约状态描述器(ReducingStateDescriptor)中,通过传入一个归约函数(ReduceFunction)来实现的。这里的归约函数,就是我们之前介绍reduce聚合算子时讲到的ReduceFunction,所以状态类型跟输入的数据类型是一样的。

public ReducingStateDescriptor(

    String name, ReduceFunction<T> reduceFunction, Class<T> typeClass) {...}

这里的描述器有三个参数,其中第二个参数就是定义了归约聚合逻辑的ReduceFunction,另外两个参数则是状态的名称和类型。


http://www.kler.cn/a/555258.html

相关文章:

  • 勒索病毒攻击:如何应对和恢复
  • 网页五子棋——对战后端
  • 【从0做项目】Java文档搜索引擎(9)烧脑终章!
  • web 通识3
  • Deepseek Natively Sparse Attention
  • 基于Python的Diango旅游数据分析推荐系统设计与实现+毕业论文(15000字)
  • 集群离线环境编译pytorch
  • 使用Nginx本地部署Axure生成的HTML文件,局域网内浏览器通过IP和地址访问
  • Qt程序退出相关资源释放问题
  • 计算机专业知识【Excel 引用大揭秘:相对、绝对与混合引用】
  • ollama stream“:True django如何返回数据
  • 企业实战 - 深入解析Python爬虫中的JS逆向技术
  • 中国科技新突破:发展态势与未来展望(哪吒2、deepseek、宇树科技等)
  • 【保姆级教程】WSL+CentOS7+Docker安装及配置
  • #渗透测试#批量漏洞挖掘#CyberPanel面板远程命令执行漏洞(CVE-2024-51567)
  • Redis(高阶篇)02章——BigKey
  • 高级应用:使用 p-retry 处理 Node.js 中的重试逻辑
  • 【 Avalonia UI 语言国际化 I18n】图文结合教学,保姆级教学,语言国际化就是这么简单(.Net C#)
  • 【Quest开发】全身跟踪
  • 在Logback中拦截和修改日志