//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分别赋给成员变量input1和input2
第二步,调用where方法(where方法是CoGroupedStream类的成员方法)
Where类是CoGroupedStream类的内部类,作用大概就是保存input1的key的选择器和key的数据类型
1、调用where需要传入一个key的选择器 ↓
where方法又调用了另一个重载的where方法,并将key的选择器和key的数据类型传入
2、将input1也就是调用coGroup的流对象的key的选择器(自己写的选择器)和key的数据类型传入下面的where方法中,之后new了一个Where类的对象,将key的选择器和key的数据类型传入构造方法中 ↓
第三步,调用equalTo方法(equalTo方法是Where类的成员方法)
EqualTo类是Where类的内部类,作用大概就是保存input2的key的选择器和key的数据类型
1、调用equalTo需要传入一个key的选择器 ↓
2、调用重载的equalTo方法,创建了一个EqualTo类的对象,将key的选择器传入构造方法中,并没有传入key的数据类型,而是将input1中key的数据类型和input2的中key的数据类型进行比较,如果不一样就抛出异常,一样就创建EqualTo类的对象 ↓
第四步,调用window方法
window方法是EqualTo类的成员方法
1、返回了一个WithWindow类的对象,将input1和input2、input1和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中
这样处理之后的两个流input1和input2,类型就会一致,包含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方法,并传入oneValue、twoValue和out
这三个参数就是我们重写coGroup方法中的形参first、second和out
之后就是通过我们写的计算逻辑输出结果了