上篇博客中,说了一下转化、分组、聚合,此博客接着连接。连接分为下面:
- union : 将数据类型相同的流合并成一个流。
- connect: 将数据类型不同的流合并一个流
- cogroup: 将数据类型不同的流合并成一个流并写到缓存到窗口中。
- join: 将数据类型不同的流合并成一个流并写到缓存到窗口中,当窗口被触发之后,两边的数据进行笛卡尔积式的计算。
- interval join : 处理数据的逻辑基本和 join 差不多,多了一点式可以扩大两个流之间的匹配范围,比如,A 是 stream1 的数据,B 是 stream2 的数据,A.timestamp - interval time <= B.timestamp <= A.timestamp + interval time 的数据。
- broadcast , 广播流,它会将广播流中的所有数据发送到另外一个流中的所有分区中,然后实现计算逻辑,这一特性可以让我们实现关联维表的功能。处理维表关联的其他方案还有异步I/O。这个会单独写一篇博客来讲解。
下面来展示一下所有 join 类型算子的功能。
union 的用法:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> src1 = env.socketTextStream("127.0.0.1", 6666);
DataStreamSource<String> src2 = env.socketTextStream("127.0.0.1", 8888);
DataStream<String> union = src1.union(src2);
union.print("------");
env.execute("test-union");
两个 source 从 socket 中读书数据,数据类型是 String 类型的,然后将两个流 union 起来,连接起来的数据都是一样的。
connect 的用法。当遇到得到两个 topic 中的数据之后,才能计算的情况下,需要使用 connect 将两个 topic 中的数据取出。下面的例子中,模拟了 inner join on 的效果,也就是取交集的效果,使用了 map state 来存储已经到来的数据,当另外一个流中的相关数据到来时,往下发送。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> src1 = env.socketTextStream("127.0.0.1", 6666);
DataStreamSource<String> src2 = env.socketTextStream("127.0.0.1", 8888);
KeyedStream<Integer, String> intSrc = src1.map(new RichMapFunction<String, Integer>() {
@Override
public Integer map(String record) throws Exception {
return Integer.parseInt(record);
}
}).keyBy(new KeySelector<Integer, String>() {
@Override
public String getKey(Integer integer) throws Exception {
return integer.toString();
}
});
KeyedStream<String, String> keyedSrc2 = src2.keyBy(x -> x);
/**
* 模拟 inner join 的逻辑,取交集
* */
intSrc.connect(keyedSrc2).process(new CoProcessFunction<Integer, String, Tuple2<String,Integer>>() {
private ValueState<List<String>> stream1Buffer = null ;
private ValueState<List<String>> stream2Buffer = null ;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
ValueStateDescriptor<List<String>> stream1BufferDesc = new ValueStateDescriptor<List<String>>("Stream1Buffer"
, TypeInformation.of(new TypeHint<List<String>>() {
})
);
ValueStateDescriptor<List<String>> stream2BufferDesc = new ValueStateDescriptor<List<String>>("Stream2Buffer"
, TypeInformation.of(new TypeHint<List<

本文介绍了Flink中处理数据流的不同连接操作,如union、connect、cogroup、join、intervaljoin和broadcast。union用于合并相同类型的数据流,connect处理不同类型的数据流,cogroup和join用于不同数据类型的流合并,并在窗口中进行计算。intervaljoin扩展了join的功能,允许更灵活的时间窗口匹配。broadcast流则用于广播数据到所有分区,常用于维表关联。文中通过示例代码详细解释了每个操作的工作原理和用法。
最低0.47元/天 解锁文章
1973

被折叠的 条评论
为什么被折叠?



