看完了实践一与实践二、我们大致对otter有了一个简单认识。
那么,我们有个大胆的想法,能否直接用otter来充当etl工具呢?我们从数据库多个业务表中选取数据,然后同步到一张累计事实表中
说干就干:
一、需求梳理:
1.接口层接收到上游单据时,需要在目标表新建一条订单记录
2..接口层接收到订单,流入wms系统后,需要对目标表相应的记录做更新,且在生命周期里每个节点都做更新('组波、拣选、二分、打包、发运')
3.业务系统的数据瘦身不能影响到云平台的数据统计
二、故事拆分
1.新建接口层映射关系,out_order表映射到云上的t_order表,out_order表的insert和update操作会转义成对t_order表的操作
2.新建wms层映射关系,t_pick_order、t_pick_order_detail_sub、t_pick_wave_detail、t_pick_list、t_pick_task、t_pick_divide_task_order、t_box等表,insert及update操作全部转义成对t_order表的update操作
3.用warehouse_id来区分各个仓库的数据
三、t_order表设计
四、配置多表同步到单张表
按照我们在实践一和实践二中的步骤,将涉及到的表映射关系搭建起来。如下图:
这里要着重讲两点:
1.如何保证在强业务时序下的数据同步?假设t_pick_order表的数据先行update,t_order表的数据后insert,那肯定会丢掉了pick_order表数据
这里我们分两步处理:a、我们依赖于权重值的设置,权重值最高的同步映射,最后处理,反则反之。
b、在配置pipeline的时候,我们可以调整并行度的值,otter同步快的一个关键的点就是利用并行度的滑动窗口设计,使得同一时间内多个tcp连接执行数据处理。
我们将并行度调整到1,则可以理解成为串行同步。
2.如何将wms表的sql强转为update?
通过查看otter源码发现,otter对insert、update操作的输出结果为insert on duplicate key update。
换句话说就是,如果你设计的目标表,与你的源表结构相差很大的时候,且有强业务逻辑的话,请避开otter的insert on duplicate key update,原因有两个,第一个是insert on duplicate key update只会从结果集中选择一条来更新,第二个是如果主键没设计好,会生成大量的脏数据。
那么,如何把insert、update操作强转成only update呢?以下几点都注意到的话,就很简单:
a.自定义代码中,将EventType改为UPDATE("U"),
b.保持keyList和columnList中没有重复的字段名,举例:如果keyList中有字段pick_order_id且columnList也存在此字段,otter在处理数据时就会报错找不到字段映射关系
c.keyList中的所有列,isKey字段必须为true
d.一定要oldKeyList,oldKeyList的size必须和keyList的size一致,且字段名也一致。如果没有oldKeyList,会走insert on duplicate key update。
下面贴一段强转的代码仅供参考:
完成