otter学习(五)—— 实践三:单源多表同步单库单表

看完了实践一与实践二、我们大致对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。

                   下面贴一段强转的代码仅供参考:

                           

完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章