数据重刷机制(抛砖引玉)

先抛出几个问题

  1. 存储是不是基石?

  2. 假如存储不挂,数据真的准确吗?

  3. 存储挂了,数据还准确吗?

  4. 如何校验是否正确?如何让其正确?机制是不是必须有?

注:sqoop抽数据,无error丢数据的概率很小

数据质量校验:数据量校验 count相同吗?count相同内容相同吗?

数据量相同–>数据量不同 重刷机制 补or删 spark 95%–>数据内容不同? 抽样 5%

现在重点理解一下重刷机制

背景:用count校验上下游的数据不准确

引入重刷机制:通过对上下游的两个表求full outer join来对比字段的null

上游表a

| id   | data  | age  |
| ---- | ----- | ---- |
| 1 | data1 | 18 |
| 2 | data2 | 19 |
| 3 | data3 | 20 |
| 7 | data7 | 22 |

下游表b

| id   | data  | age  |
| ---- | ----- | ---- |
| 1 | data1 | 18 |
| 2 | data2 | 19 |
| 3 | data3 | 20 |
| 7 | data7 | 22 |

我们发现表 a 和表 b 对比 表 a 少了 5 、6 多了 7 ,表 b 少了 2 、 7 多了 6,我们现在对两个表做 full outer join

| aid  | data   | age  | bid  |
| ---- | ------ | ---- | ---- |
| 1 | ruoze1 | 18 | 1 |
| 2 | ruoze2 | 19 | null |
| 3 | ruoze3 | 20 | 3 |
| 7 | ruoze7 | 22 | null |
| null | null | null | 5 |
| null | null | null | 6 |

以表 a 为标准,对生成后的大表做筛选,分别查找 aidbidnull 的记录

select from t where aid=null 

select from t where bid=null

发现 bid为 5 、 6 的行 aidnull,说明 bid 下游数据多了,根据 bid 重新构建

delete from b where bid=5     
delete from b where bid=6

发现 aid 为 2 、 7 的 bidnull,说明 bid 下游数据少了,根据 aid 重新构建

insert into 2 ruoze2 19 
insert into 7 ruoze7 22

经过重新构建也就是重刷后的数据是

| aid  | data   | age  | bid  |
| ---- | ------ | ---- | ---- |
| 1 | ruoze1 | 18 | 1 |
| 2 | ruoze2 | 19 | 2 |
| 3 | ruoze3 | 20 | 3 |
| 7 | ruoze7 | 22 | 7 |

深度思考:

full outer join 其实就是先 left join 和后 right join 的两个结果,为 null 的刚好是缺少的或者多的,而交集是上下游都有的数据,需要做的是 left joinnullinsert 或者 delete,还是 right join 为 null 做 insert 或者 delete

Author: Tunan
Link: http://yerias.github.io/2018/10/07/mysql/%E6%95%B0%E6%8D%AE%E9%87%8D%E5%88%B7%E6%9C%BA%E5%88%B6/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.