Flink Windows 多流 Join 和 SQL Join

Flink Windows Join 都是 Inner Join

两个流join时,先做join操作,形成JoinedStream,然后再指定Window,最后接着join后的transform操作。

案例:

inputStream1:DataStream[(Long,String,Int)] = ...
inputStream2:DataStream[(String,Long,Int)] = ...
//通过DataStream Join方法将两个数据流关联
inputStream1.join(inputStream2)
    //指定inputStream1的关联Key
    .where(_._1) 
    //指定inputStream2的关联Key
    .equalTo(_._2)/
    //指定Window Assigner
    .window(TumblingEventTimeWindows.of(Time.milliseconds(10)))
  .apply() //指定窗口计算函数

根据窗口的不同,数据计算的方式不同

根据窗口的选择,依次对应于:

滚动窗口关联:Tumbling Window Join

滑动窗口关联:Sliding Window Join

会话窗口关联:Session Window Join

间隔关联:Interval Join

间隔关联 Join

间隔关联与其他窗口关联不同,间隔关联的数据元素关联范围不依赖窗口划分,而是通过DataStream元素的时间加上或减去指定Interval作为关联窗口,然后和另外一个DataStream的数据元素时间在窗口内进行Join操作。

Flink Windows 多流 Join 和 SQL Join_第1张图片

示例代码:


//创建黑色元素数据集
val blackStream: DataStream[(Int, Long)] = env.fromElements((2, 21L), (4, 1L), (5, 4L))
//创建白色元素数据集
val whiteStream: DataStream[(Int, Long)] = env.fromElements((2, 21L), (1, 1L), (3, 4L))
//通过Join方法将两个数据集进行关联
val windowStream: DataStream[String] = blackStream.keyBy(_._1)
//调用intervalJoin方法关联另外一个DataStream
  .intervalJoin(whiteStream.keyBy(_._1))
//设定时间上限和下限
  .between(Time.milliseconds(-2), Time.milliseconds(1))
  .process(new ProcessWindowFunciton())
//通过单独定义ProcessWindowFunciton实现ProcessJoinFunction
class ProcessWindowFunciton extends ProcessJoinFunction[(Int, Long), (Int, Long), String] {
  override def processElement(in1: (Int, Long), in2: (Int, Long), context: ProcessJoinFunction[(Int, Long), (Int, Long), String]#Context, collector: Collector[String]): Unit = {
    collector.collect(in1  + ":" + (in1._2 + in2._2))
  }
}

Flink SQL Join

经典的Join算法-归并连接算法

Flink Windows 多流 Join 和 SQL Join_第2张图片

经典的Join算法-哈希连接算法

Flink Windows 多流 Join 和 SQL Join_第3张图片

Flink 流式SQL - 普通连接Join

对于不带窗口的全量连接,内部Join算子,会维护A、B两张表的哈希索引。当A表中插入一条数据时会查B的索引,寻找Join的条件数据,同时将本条数据加入A的索引。反之亦然。但是这种join会随着数据量的增加,哈希表维护成本可能会无限增长下去。

解决方式是通过状态TTL等手段加以限制。

Flink 流式SQL - 基于时间窗口连接Join

Flink Windows 多流 Join 和 SQL Join_第4张图片

Flink Windows 多流 Join 和 SQL Join_第5张图片

Flink 流式SQL - 基于待时间记录的历史表连接

你可能感兴趣的:(小白爱AI)