Flink的几种Join总结

发布时间 2023-06-07 11:34:13作者: 田野与天

Regular join组

第一种:
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秒才删除,也就是如果不论是左流还是右流,只要某个值一直被关联,那么就一直不会过期。

底层原理