1. 程式人生 > 實用技巧 >數倉搬遷:從方法到實踐,帶你解決資料一致性對比

數倉搬遷:從方法到實踐,帶你解決資料一致性對比

摘要:資料倉庫建設過程中,總是會涉及到不同平臺、同一平臺物理環境搬遷,由於資料倉庫資料量龐大,往往資料搬遷不可能在一個短週期內完成,會涉及資料同步、校驗、追批並跑、再校驗過程。

本文主要闡述資料校驗過程設計,供相關人員借鑑。

資料一致性校驗最核心內容項

校驗手段

根據常見資料儲存型別,主要完成物件級記錄一致性校驗,欄位級數值、時間、字元型別的資料一致性校驗,即常規提到的表級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.com/查詢下載

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展現介面,用於使用者錄入自定義校驗規則以及檢視資料校驗情況。

點選關注,第一時間瞭解華為雲新鮮技術~