KeyBy算子学习 | 青训营笔记

178 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第9天

今天老师要求更新项目进度了,啊啊啊啊啊啊,开始慌张,我们小组真的还没咋动,出大问题
我们组选的题目是项目二,然后老师要求在实际开始设计我们的简易流计算系统前,我们需要首先设计并实现一套流计算 API 来编写流计算应用。需要定义一个抽象的数据结构来表示一个无界的数据流,然后定义一个API,然后要实现五个算子,我被分到的是KeyBy算子

KeyBy

KeyBy是什么

把一个 DataStream 按照 key 分割成多个正交的 DataStream
主要作用:把相同的数据,汇总到相同的分区中,也就是按指定的Key对数据重分区。将同一Key的数据放到同一个分区
通过keyBy,DataStream→KeyedStream。

逻辑上将流分区为不相交的分区。具有相同Keys的所有记录都分配给同一分区。在内部,keyBy() 是使用散列分区实现的。指定键有不同的方法。

此转换返回KeyedStream,其中包括使用被Keys化状态所需的KeyedStream
如果出现以下情况,则类型不能成为关键

  1. 它是POJO类型但不覆盖hashCode() 方法并依赖于Object.hashCode() 实现。
  2. 它是任何类型的数组。

KeyBy用法

第一种是 key(Interger) 用法,传入一个整数,这个整数对应的是元组中的元素顺序是第几个,(注:可以是多个key,不一定只有一个,下图为了方便只写了一种)(只适合上一级传过来的数据是元组类型的)

第二种是 Key(String)用法,这个String 只能是f0,f1,,,,,原因是上一级的是元组类型,而元组本身已经为变量写了变量名了
第三种是new Keyseletor方法来构造一个匿名内部类来返回key

最后一种是 在flink自带的类型不好用的时候,自己封装一个bean,在上一级的传递值中new,然后按照之前元组同样的方法来选定Key进行分区


呜呜呜,这玩意,太难学了!