Flink中coGroup的笔记

//stream和otherStream可以是相同的流,也可以是不同的流
stream.coGroup(otherStream)
    .where(<KeySelector>)
    .equalTo(<KeySelector>)
    .window(<WindowAssigner>)
    .apply(<JoinFunction>)

学生笔记,写的不好不对,请指点

第一步,调用coGroup方法(where方法是DataStream类的成员方法)

一、首先调用coGroup方法,coGroup方法返回CoGroupedStream对象,将调用coGroup的流对象this传入的流对象otherStream传入CoGroupedStream类的构造方法-----T为当前流对象里面存放的数据类型,T2为传入的流对象的数据类型

二、CoGroupedStream类的构造方法会将调用coGroup的流对象this传入的流对象otherStream分别赋给成员变量input1input2


第二步,调用where方法(where方法是CoGroupedStream类的成员方法)

 Where类是CoGroupedStream类的内部类,作用大概就是保存input1key的选择器key的数据类型

1、调用where需要传入一个key的选择器 

where方法又调用了另一个重载的where方法,并将key的选择器和key的数据类型传入

2、将input1也就是调用coGroup的流对象key的选择器(自己写的选择器)key的数据类型传入下面的where方法中,之后new了一个Where类的对象,将key的选择器key的数据类型传入构造方法中 ↓


 第三步,调用equalTo方法(equalTo方法是Where类的成员方法)

EqualTo类Where类的内部类,作用大概就是保存input2key的选择器key的数据类型

1、调用equalTo需要传入一个key的选择器 

2、调用重载的equalTo方法,创建了一个EqualTo类的对象,将key的选择器传入构造方法中,并没有传入key的数据类型,而是将input1中key的数据类型input2的中key的数据类型进行比较,如果不一样就抛出异常,一样就创建EqualTo类的对象 ↓

 

 第四步,调用window方法

window方法是EqualTo类的成员方法

1、返回了一个WithWindow类的对象,将input1和input2input1和input2的key选择器key的数据类型创建的窗口类型一起传入构造方法中

2、这个构造方法,会将传入的数据,赋值给WithWindow类的成员变量 ↓

注意!WithWindow类CoGroupedStream类的内部类


第五步、调用apply方法(apply方法是WithWindow类的成员方法)

1、调用apply方法,会将传入的计算逻辑function返回值类型resultType传给重载方法 ↓

 2、这是最重要的一步

(1)--将两个数据流的数据类型和key的选择器分别封装到一起

(2)--因为(3)中使用的是union方法,这个方法要求两个流的类型必须一致,而coGroup的两个流类型可能不一致,所以这一步就是将input1和input2封装成一样的DataStream流以便union到一起

点到Input1Tagger里面,看到调用了TaggedUnion.one,再看到TaggedUnion这个类里面,这个类也是CoGroupedStreams的内部类,调用TaggedUnion.one方法时会将一个流的数据保存到成员变量one中,

点到Input2Tagger里面,看到调用了TaggedUnion.two,调用TaggedUnion.two方法时会将一个流的数据保存到成员变量two

这样处理之后的两个流input1input2,类型就会一致,包含input1数据taggedInput1成员变量one有数据,two为null,包含input2数据的taggedInput2成员变量two有数据,one为null

(3)--将两个流union到一起

(4)KeyedStream就是keyBy时返回的类型 ,将之前封装的数据类型、key的选择器和union到一起的两个流传入,再调用window,这一步就是keyBy之后再划分窗口,keyBy的目的是将相同key的数据放到同一个空间(分区)中,划分window的目的是让每个流中的数据都放慢脚步,等等对方(划分相同类型、长度一样的窗口)

 

 (5)第五步是窗口触发时会调用,具体不清楚

点进CoGroupWindowFunction类中可以发现里面有一个apply方法

这个方法首先创建了两个ArrayList,在循环中判断,传进来的合并流中成员变量one有数据还是two有数据,分别存入到oneValue中和twoValue

 最后调用了我们自己重写的coGroup方法,并传入oneValuetwoValueout

这三个参数就是我们重写coGroup方法中的形参first、second和out

之后就是通过我们写的计算逻辑输出结果了

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值