关于数据:数仓搬迁从方法到实践带你解决数据一致性对比

5次阅读

共计 4095 个字符,预计需要花费 11 分钟才能阅读完成。

摘要:数据仓库建设过程中,总是会波及到不同平台、同一平台物理环境搬迁,因为数据仓库数据量宏大,往往数据搬迁不可能在一个短周期内实现,会波及数据同步、校验、追批并跑、再校验过程。

本文次要论述数据校验过程设计,供相干人员借鉴。

数据一致性校验最核心内容项

校验伎俩

依据常见数据存储类型,次要实现对象级记录一致性校验,字段级数值、工夫、字符类型的数据一致性校验,即惯例提到的表级 count、字段级数值的 sum、工夫类型差值 sum、字符类型的 checksum。

下文以 TD 搬迁 GaussDB(DWS)为例,

1. 记录数

a) 表级 count(*)

2. 数据类型

a) 汇总 Sum(cola)

b) 均匀 Avg(cola)

c) 例外,针对 float 类型这种存在精度缺失场景,或间接不校验,或比对两个平台差别小于 5% 范畴即可承受;

d) 注意事项,不同平台可能存在 sum 放大小数点位数问题,可通过指定小数点地位,让两个平台数值完全一致;

3. 工夫类型

a) 汇总 Sum(工夫转换数字)

b) Date 类型实现款式

i. DWS:select extract(epoch from ‘20200819’::date);

ii. TD:sel (date’2020-08-19′-date’1970-01-01′)*86400;

c) Time 类型实现款式

i. DWS:select extract(epoch from ’12:12:12′::time);

ii. TD:sel extract(hour from time’12:12:12′)3600+extract(minute from time’12:12:12′)60+extract(second from time’12:12:12′);

d) TimeStamp 类型实现

i. DWS:select extract(epoch from ‘2020-08-19 12:12:12’::timestamp);

ii. TD:sel ((timestamp’2020-08-19 12:12:12′(date))-date’1970-01-01′)86400+extract(hour from timestamp’2020-08-19 12:12:12′)3600+extract(minute from timestamp’2020-08-19 12:12:12′)*60+extract(second from timestamp’2020-08-19 12:12:12′);

e) 行将两个平台将采纳同一周期进行工夫类型汇总,保证数据求和一致性;

4. 字符类型

a) 整体思路是将字符串在同一字符集条件下计算 MD5 值,再进行 MD5 串切分、异或(XOR),失去绝对较小数值,再进行数值 sum 求和;

注,若两个平台均反对自定义聚合函数,能够间接进行每个字符串 MD5 值计算,再进行全副 MD5 值异或操作,失去最终值,用于辨认数据一致性;

b) DWS 实现逻辑

创立自定义函数,

Create or replace function xor_md5(text) returns bigint immutable as $$
select ('x'||lpad(substr(md5($1),1,8),16,'0'))::bit(64)::bigint
     # ('x'||lpad(substr(md5($1),9,8),16,'0'))::bit(64)::bigint
     # ('x'||lpad(substr(md5($1),17,8),16,'0'))::bit(64)::bigint
     # ('x'||lpad(substr(md5($1),25,8),16,'0'))::bit(64)::bigint;
$$ language sql;
create function xor_md5_latin(text) returns bigint immutable as $$
select ('x'||lpad(substr(md5(convert($1,'GB18030')),1,8),16,'0'))::bit(64)::bigint
     # ('x'||lpad(substr(md5(convert($1,'GB18030')),9,8),16,'0'))::bit(64)::bigint
     # ('x'||lpad(substr(md5(convert($1,'GB18030')),17,8),16,'0'))::bit(64)::bigint
     # ('x'||lpad(substr(md5(convert($1,'GB18030')),25,8),16,'0'))::bit(64)::bigint;
$$ language sql;

c) TD 实现逻辑

i. 形式一:创立 SQL 自定义函数

replace function xor_md5(inpt varchar(32000))
returns bigint
language sql
deterministic contains sql
sql SECURITY DEFINER
collation INVOKER
INLINE TYPE 1
return
bitxor( bitxor ( bitxor (
cast(from_bytes(to_bytes(translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),1,8)
       using latin_to_unicode),'base16'),'base10') as bigint)
,cast(from_bytes(to_bytes(translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),9,8)
       using latin_to_unicode),'base16'),'base10') as bigint))
,cast(from_bytes(to_bytes(translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),17,8)
       using latin_to_unicode),'base16'),'base10') as bigint))
,cast(from_bytes(to_bytes(translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),25,8)
       using latin_to_unicode),'base16'),'base10') as bigint));

注,TD 通常实际中以 Latin 存储 GBK 中文数据,而 GaussDB(DWS)个别举荐采纳支流 UTF8 字符集存储数据,则单方进行字符 md5 计算时,需转换成同一个字符集,其中波及 hash_md5、udf_utf16to8、udf_w936to16 三个非 TD 内置函数,须要 https://downloads.teradata.co…

ii. 形式二:创立 C 自定义函数

replace function xor_md5_latin (arg varchar(32000) character set latin)
returns bigint
language c
no sql
external name 'ci:md5:md5.h:cs:xor_md5:xor_md5_latin.c:cs:md5:md5.c:F:xor_md5'
parameter style td_general;
replace function xor_md5(inpt varchar(32000))
returns bigint
language sql
deterministic contains sql
sql SECURITY DEFINER
collation INVOKER
INLINE TYPE 1
return
xor_md5_latin(udf_utf16to8(udf_w936to16(inpt,'')));

C 代码若有须要私聊留言

d) 测试数据如下

i. TD 执行状况

Select xor_md5(‘a’);
------------------------
2491710610
Select xor_md5_latin(‘中国’);
------------------------
66934228
Select xor_md5(‘中国’);
------------------------
1004201695
ii.              GS 执行状况
Select xor_md5(‘a’);
------------------------
2491710610
Select xor_md5_latin(‘中国’);
------------------------
66934228
Select xor_md5(‘中国’);
------------------------
1004201695

校验数据范畴

依据数据仓库数据个性,进行 切片粒度 数据收集,除记录数统计之外,其它均以字段级粒度收集数据,即一个切片一个字段产生一条记录信息。

_

_

注:针对 VA 类型,存在多日流水数据发生变化场景,将最新变动流水数据打包成一个切片进行校验;

通过以上切片粒度,实现数据增量校验;而每隔一个周期,再进行全量校验,保障数据残缺、统一;

校验形式

依据数据仓库个性,能够分为惯例批量校验和自定义校验;

通常,能够将校验嵌入批量过程中,即对应作业的数据表发生变化后,间接触发相干数据表校验,这样实现数据准实时校验,保障两个平台并跑期间数据一致性;另外,在确保两个平台数据稳固前提下,能够固定时间段或用户间接发动实时校验,用于核查平台一致性;

校验策略

可进行数据表分级分类,将无限校验计算资源投入到数据一致性校验中,可参照以下分类,

自动化服务

以上论述了相干实现的方法论,最初再探讨一下如何实际;

自动化校验框架,倡议常驻 rest 服务,用于接管客户端触发的校验申请,散发各数据平台执行校验采集工作,利用 rest 服务实现跨服务器交互问题;采纳一个 portal 展示界面,用于用户录入自定义校验规定以及查看数据校验状况。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0