Flink的Join总结
背景
Flink中有六种Join。
col1 | col2 | col3 |
---|---|---|
Regular Join | 常规的两个流数据 | |
Interval Join | 让一条流去 Join 另一条流中前后一段时间内的数据 | |
Temporal Join | 使用明细表去 join Versioned Table 的 Join 操作 | |
Lookup Join | 维表 Join, 流与Redis, MySQL, HBase等的Join | |
Array Expansion | 将Array类型字段拍平 | |
Table Function | UDTF函数 |
Join
regular join
col1 | col2 |
---|---|
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秒才删除,也就是如果不论是左流还是右流,只要某个值一直被关联,那么就一直不会过期。
Interval Join组
Interval Join 可以让一条流去 Join 另一条流中前后一段时间内的数据。底层实现是同时保留2个流一定时间,然后这样一个流既可以关联另外一个流过去一段时间范围内的数据,还能关联另外一个流未来一段时间内的数据。未来的数据是指当前时刻,还没有到的数据。要做到这一点,必须要把当前流的数据也保留起来,等另外一个流的未来的数据到了,要通知到当前这条数据去重新关联一下。
Temporal Join组
详见[1]。此处略过。
原理
Join()
Join算子的语义为Window Join。
Join算子可以实现Inner Join。
coGroup()
left/right join,通过coGroup()算子实现。
intervalJoin()
按照字段以及右流相对左流偏移的时间区间进行关联。