本文重点
对于两条流的合并,很多情况我们并不是简单地将所有数据放在一起,而是希望根据某个字段的值在某些时间段内将它们联结起来,“配对”去做处理。例如用传感器监控火情时,我们需要将大量温度传感器和烟雾传感器采集到的信息,按照传感器 ID 分组、再将两条流中数据合并起来,如 果同时超过设定阈值就要报警。
API
stream1.join(stream2) .where(<KeySelector>) .equalTo(<KeySelector>) .window(<WindowAssigner>) .apply(<JoinFunction>)join用于将两个流合并,得到一个JoinedStreams,首先通过where和equalTo来分别指定两条流中的key(where指定第一条流中的key,equalTo指定第二条流中的key),然后通过window来定义窗口(滚动窗口、滑动窗口和会话窗口),最后通过apply传入联结窗口函数进行处理计算。
联结函数如下:
public interface JoinFunction<IN1, IN2, OUT> extends Function, Serializable { OUT join(IN1 first, IN2 second) throws Exception; }如上所示有三个方法:
IN1表示第一条流的类型
IN2表示第二条流的类型
OUT表示联接之后的输出