Flink个人学习整理-join篇(十一)
join算子分为 Window Join 和 Interval Join
Interval Join:每条数据到来后,会扫描上界以及下届时间范围。
orderEventSingleOutputStreamOperator.keyBy(OrderEvent::getTxId)
.intervalJoin(txEventSingleOutputStreamOperator.keyBy(TxEvent::getTxId))
// 展示数据的下界和上界,默认为 [-5,10]
.between(Time.seconds(-5),Time.seconds(10))
// 不包含下界 -5
.lowerBoundExclusive()
// 不包含上界 10
.upperBoundExclusive()
// 结果为 (-5,10)
.process(new ProcessJoinFunction<OrderEvent, TxEvent, Tuple2<OrderEvent,TxEvent>>() {
@Override
public void processElement(OrderEvent left, TxEvent right, Context ctx, Collector<Tuple2<OrderEvent, TxEvent>> out) throws Exception {
out.collect(Tuple2.of(left,right));
}
})
.print();
注意:
使用Interval Join的方式,做两个流的关联
1、严格校验数据本身
2、相当于Inner join
如果想要实现Left outer join / Right outer join / Full outer join
那么必须使用状态来实现,通过侧输出来控制join实现的方式