
1、DataStream
代表一个运行在多个分区上的并行流,转换操作都是逐条的。
可以从 StreamExecutionEnvironment 或者env.addSource(SourceFunction) 获得。
常用操作:map(),flatMap(),filter()、rebalance()、 broadcaseted()
2、KeyedStream
用来表示根据指定的key进行分组的数据流,执行任何转换操作都将返回DataStream。
可以通过调用DataStream.keyBy()来获得。
常用操作:reduce()、fold()、sum()、max()
3、WindowedStream
代表了根据key分组,并且基于WindowAssigner切分窗口的数据流。
执行任何转换操作都将返回DataStream。
可以通过KeyedStream.window()来获得。
常用操作:reduce()、fold()、sum()、max()
4、AllWindowedStream
代表了在DataStream上,并且基于WindowAssigner切分窗口的数据流。
执行任何转换操作都将返回DataStream。
可以通过DataStream.windowAll()来获得。会导致所有分区数据汇集到一个task上。
常用操作:reduce()、fold()、sum()、max()
5、ConnectedStreams
代表了根据两个流合并的组合流,组合流回包含两个流中的数据。
ConnectedStreams可以对两个不同流应用不同的处理方法,两个流之间还可以共享状态。
可以通过DataStream.connect(ds1) 来获得。
union连接的是多个相同类型的流,返回DataStream。connect连接的是两个流,类型可以不一致,返回
ConnectedStreams。
6、CoGroupedStreams
代表了对同一个Key上的两组流的全部数据在同一窗口内进行join操作。如果涉及到和上一条数据交互的操
作,只能用coGroup。
可以通过DataStream.coGroup()来获得。
常用操作:
ds1.coGroup(ds2).where(ds1.id).equalTo(ds2.id)
.window(TumblingProcessingTimeWindows.of(Time.minutes(1)))
.trigger(trigger) ---触发执行,可以不写
.evictor(evictor) ---可以不写
.apply(new CoGroupFunction(ds1,ds2,key的类型){ 重写coGroup函数})
Flink得DataStream只提供了inner join形式,如果要实现left/right join,可以在apply方法中重写coGroup函数。
7、JoinedStreams
代表了对双流的同一个Key上的每对(笛卡儿积的每一行)数据在同一窗口内进行join操作。
是CoGroupedStreams的特例。JoinedStreams和CoGroupedStreams重写的coGroup函数是不一样的。
可以通过DataStream.join()来获得。
常用操作:
ds1.join(ds2).where(ds1.id).equalTo(ds2.id)
.window(TumblingProcessingTimeWindows.of(Time.minutes(1)))
.trigger(trigger) ---触发执行,可以不写
.evictor(evictor) ---可以不写
.apply(new FlatJoinCoGroupFunction(ds1,ds2,key的类型){ 重写coGroup函数})
以上是flink常见的几种数据结构,最后两类joinedStreams和CoGroupedStreams是通过DataStream的join操作得到的,而这种join只能对同一窗口内的数据进行join,如果数据延迟了呢?这就需要使用基于
KeyedStream的intervalJoin操作。
8、intervalJoin
如果要join的数据跨窗口,那么就必须使用intervalJoin来连接两个带事件时间watermark的KeyedStream。
常用操作:
DataStream result = ds1
.keyBy(id)
.intervalJoin(ds2.keyBy(id))
.between(Time.seconds(-2), Time.seconds(1)) --相同key数据,ds1当前时间的数据和ds2[-2,1]时间内数据进行连接操作
.process(new ProcessJoinFunction(ds1,ds2,key的类型){重写processElement函数})
参考文章:
Flink 原理与实现:数据流上的类型和操作
http://wuchong.me/blog/2016/05/20/flink-internals-streams-and-operations-on-streams/
FLINK DATASTREAM中COGROUP实现原理与三种 JOIN 实现
https://www.freesion.com/article/2617540446/
Flink - CoGroup
https://www.cnblogs.com/fxjwind/p/7216981.html
Flink DataStream 如何实现双流Join
https://copyfuture.com/blogs-details/20210506121130019c