主要任务
从Kafka topic_db主题筛选支付成功数据、从dwd_trade_order_detail主题中读取订单事实数据、MySQL-LookUp字典表,关联三张表形成支付成功宽表,写入 Kafka 支付成功主题。(支付成功需求)
思路分析
1**)设置 **ttl
支付成功事务事实表需要将业务数据库中的支付信息表payment_info 数据与订单明细表关联。订单明细数据是在下单时生成的,经过一系列的处理进入订单明细主题,通常支付操作在下单后15min 内完成即可,因此,支付明细数据可能比订单明细数据滞后15min。考虑到可能的乱序问题,ttl 设置为15min + 5s。
2**)获取订单明细数据**
用户必然要先下单才有可能支付成功,因此支付成功明细数据集必然是订单明细数据集的子集。
3**)筛选支付表数据**
获取支付类型、回调时间(支付成功时间)、支付成功时间戳。
生产环境下,用户支付后,业务数据库的支付表会插入一条数据,此时的回调时间和回调内容为空。通常底层会调用第三方支付接口,接口会返回回调信息,如果支付成功则回调信息不为空,此时会更新支付表,补全回调时间和回调内容字段的值,并将payment_status 字段的值修改为支付成功对应的状态码(本项目为1602)。支付成功之后,支付表数据不会发生变化。因此,只要操作类型为update 且状态码为1602 即为支付成功数据。
由上述分析可知,支付成功对应的业务数据库变化日志应满足两个条件:
(1)payment_status 字段的值为1602;
(2)操作类型为 update。
本程序为了去除重复数据,在关联后的宽表中补充了处理时间字段,DWS 层将进行详细介绍。支付成功表是由支付成功数据与订单明细做内连接,而后与字典表做LookUp Join 得来。这个过程中不会出现回撤数据,关联后表的重复数据来源于订单明细表,所以应按照订单明细表的处理时间字段去重,故支付成功明细表的row_op_ts 取自订单明细表。
4**)构建 MySQL-LookUp 字典表**
5**)关联上述三张表形成支付成功宽表,写入Kafka **支付成功主题
支付成功业务过程的最细粒度为一个sku 的支付成功记录,payment_info 表的粒度与最细粒度相同,将其作为主表。
(1) payment_info 表在订单明细表中必然存在对应数据,主表不存在独有数据,因此通过内连接与订单明细表关联;
(2) 与字典表的关联是为了获取 payment_type 对应的支付类型名称,主表不存在独有数据,通过内连接与字典表关联。下文与字典表的关联同理,不再赘述。
图解
代码编写
测试
创建dwd_trade_pay_detail_suc 主题
bin/kafka-topics.sh --zookeeper hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka --create --replication-factor 1 --partitions 1 --topic dwd_trade_pay_detail_suc
消费 dwd_trade_pay_detail_suc 主题
启动 DwdTradeOrderPreProcess ,_ _DwdTradeOrderDetail 与 DwdTradePayDetailSuc 类
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic dwd_trade_pay_detail_suc
开始启动