0%

维表 JOIN 的原理介绍及源码剖析

前言

本文是 Flink SQL 系列中的一篇,更多文章请关注Flink SQL 系列文档
内容全部是原创,如有错误,欢迎铁汁们指出。另外,未经同意,不得转载。

原理梳理

LookupJoin 根据获取维表数据的方式是同步获取还是异步获取分为两种实现。同步的实现基于 ProcessOperator,异步的实现基于 AsyncWaitOperator。

Sync LookupJoin

1
对于同步的 LookupJoin 来说,主表一条数据 Record 来了以后,会经过以下几个步骤:

  1. 分析 Record 的 Key,基于 Key 去维表侧获取数据
  2. 如果维表上有 Calc,维表返回的数据需要经过 CalcCollector,做过滤或者列裁剪后才会返回
  3. 如果 JOIN 条件里除了维表上的 LookupKey 还有剩余的关联条件,经过 CodeGen TableFunctionCollector,过滤出满足 Remaing Condition 的数据
  4. TableFunctionCollector 里关联主表的 Record 和第3步返回的一条或多条维表记录

Async LookupJoin

2
异步的 LookupJoin 和同步的 LookupJoin 最大的区别就是当前主表的数据来了以后,发出异步关联请求后,不需要等请求返回,就可以处理下一条主表的输入数据了。对于异步的 LookupJoin 来说,主表一条数据 Record 来了以后,经过的流程:

  1. 分析 Record 的 Key,向维表发出异步的数据请求后,就可以处理下一条输入数据了
  2. 如果维表上有 Calc,维表返回的数据需要经过 TemporalTableCalcResultFuture,做过滤或者列裁剪后才会返回
  3. 如果 JOIN 条件里除了维表上的 LookupKey 还有剩余的关联条件,经过 CodeGen TableFunctionResultFuture,过滤出满足 Remaing Condition 的数据
  4. JoinedRowResultFuture 关联主表的 Record 和第3步返回的一条或多条维表记录