Flink的Join总结

  |   0 评论   |   0 浏览

背景

Flink中有六种Join。

col1col2col3
Regular Join常规的两个流数据
Interval Join让一条流去 Join 另一条流中前后一段时间内的数据
Temporal Join使用明细表去 join Versioned Table 的 Join 操作
Lookup Join维表 Join, 流与Redis, MySQL, HBase等的Join
Array Expansion将Array类型字段拍平
Table FunctionUDTF函数

Join

regular join

col1col2
left join流任务中,只要left的流数据到了,就输出。如果右边流没有到,输出 [L,NULL];如果右边流到了,输出 [L, R]
right join流任务中,只要right的流数据到了,就输出。如果左边流没有到,输出 [NULL,R];如果右边流到了,输出 [L, R]
inner join流任务中,只有两条流 Join 到才输出,输出 [L, R]
outer join (full join) 全链接流任务中,左流或右流的数据到达之后,无论有没有 Join 到另外一条流的数据,都会输出。对右流来说:能Join 到左边就输出 +[L, R];没 Join 到输出 +[null, R];对左流来说:能Join 到右流就输出 +[L, R],没 Join 到输出 +[L, null];

无过期时间

SELECT *
FROM Orders
INNER JOIN Product
ON Orders.product_id = Product.id;


SELECT *
FROM Orders
LEFT JOIN Product
ON Orders.product_id = Product.id


SELECT *
FROM Orders
RIGHT JOIN Product
ON Orders.product_id = Product.id


SELECT *
FROM Orders
FULL OUTER JOIN Product
ON Orders.product_id = Product.id

上述的这些没有设置过期时间的inner join / left join /right join /full join ,默认的数据不会过期。

有过期时间

  • 当inner join 设置了过期时间,比如10秒,那么左流和右流都是严格保存10秒,不管你是不是一直在用在read这个数据,它到时间了都会被删掉。
  • 当left join 设置了过期时间,比如10秒,那么左流和右流是有区别的,右流还是不管你在不在用都是准时删除;而左流就是闲置10秒才会被删除,也就是如果左流的某个值一直被关联,那么就一直不会过期。
  • 当right join 设置了过期时间,比如10秒,那么左流和右流是有区别的,左流还是不管你在不在用都是准时删除;而右流就是闲置10秒才会被删除,也就是如果右流的某个值一直被关联,那么就一直不会过期。
  • 当 join 设置了过期时间,比如10秒,那么左流和右流都是闲置10秒才删除,也就是如果不论是左流还是右流,只要某个值一直被关联,那么就一直不会过期。

image.png

Interval Join组

Interval Join 可以让一条流去 Join 另一条流中前后一段时间内的数据。底层实现是同时保留2个流一定时间,然后这样一个流既可以关联另外一个流过去一段时间范围内的数据,还能关联另外一个流未来一段时间内的数据。未来的数据是指当前时刻,还没有到的数据。要做到这一点,必须要把当前流的数据也保留起来,等另外一个流的未来的数据到了,要通知到当前这条数据去重新关联一下。

Temporal Join组

详见[1]。此处略过。

原理

Join()

Join算子的语义为Window Join。

image.png

Join算子可以实现Inner Join。

coGroup()

left/right join,通过coGroup()算子实现。

intervalJoin()

按照字段以及右流相对左流偏移的时间区间进行关联。

image.png

参考

  1. Flink的几种Join总结