Hive 两张表数据验证方案、两张大表如何进行数据验证以及剔除部分字段进行数据验证

  最近的问题是,宽表在上线之前,需要在测试环境进行试跑,试跑结束后如何跟线上正式数据进行比对呢?简单记录一下设计方案。

  1、小表数据验证

        一些字段比较少的表进行数据验证的方案之前出过

Hive 数据模型切换后的数据验证方案_小菜菜1223的博客-CSDN博客

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;

你可能感兴趣的:(Hive,hive,大数据)