最近的问题是,宽表在上线之前,需要在测试环境进行试跑,试跑结束后如何跟线上正式数据进行比对呢?简单记录一下设计方案。
1、小表数据验证
一些字段比较少的表进行数据验证的方案之前出过
Hive 数据模型切换后的数据验证方案_小菜菜1223的博客-优快云博客
select * from (
select contr_no
,user_id
,unique_id
,if_open_cooperator
from test.a
where dt='20220908'
) a
join (
select contra_no
,usr_id
,prod_cd
,if_open_cooperator
from test.b
where dt='20220908'
) b
on a.contr_no=b.contra_no
where (
coalesce(a.if_open_cooperator,'')!=coalesce(b.if_open_cooperator,'')
)
;
2、宽表数据验证
本次宽表数据验证我想得方法是讲两张表的数据进行union,然后group by 一下查看是否有!=1的数据,这样就能检测出数据有无差异。
select usr_id from (
select * from data_mart_tmp.cust_info_five_lgy_test
union
select * from data_mart_tmp.cust_info_five_lgy_test_2
)a
group by usr_id
having count(*)!=1;
本次宽表的痛点是,如果数据中包含了concat_ws组合出来的数据,本来两条数据是正确的,但是concat_ws的字段数据存在了顺序问题,这样怎么解决呢?
思路就是:
一般concat_ws的字段会比较少,我们可以把这几个字段不进行比较或单独比较,那么在一个几百字段的表格中,如何把剩余的字段拿出来比较呢?
还好Hive支持了这种功能
利用正则将不需要的字段过滤出去不取即可了
set hive.support.quoted.identifiers=none;
select usr_id from (
select `(his_coop_of_withdrawal|source_of_valid_contra)?+.+` from dmp.dm_dmp_cust_info where dt='20221010'
union
select `(his_coop_of_withdrawal|source_of_valid_contra)?+.+` from dmp.dm_dmp_cust_info_test where dt='20221010'
) a
group by usr_id
having count(*)!=1;