关于ETL过程如何保证数据量的准确性和数据的正确性的讨论

时间:2022-09-14 08:53:56

原创于2008年06月06日,2009年10月22日迁移至此。


关于 ETL 过程如何保证数据量的准确性和数据的正确性的讨论

Flywolf2000

这个问题很简单,就是 ETL 过程中,你怎么保证数据的准确性,这个准确性包含两个方面:数据量的准确性,数值的正确性。 ITPUB个人空间l;o` ^*c

a)V f6G~,gC5q6517
这个问题看起来很简单,但是却包含很多内容: ITPUB个人空间7x'g'Jk6Ku
A
、字符集的转换 —— 怎么将基于不同字符集的数据转换到目的数据库
5Fk+Oj-`n6517 B
、数据量的准确性 —— 使用 ETL 工具的质量监控工具就那么准么?我可遇到过不准的情况哦。
2NTA[?2R:au3w6q`6517 C
discard 的数据怎么重新能够加载回目的数据库中( ETL 已经完毕了,并不是所有的数据能够重新加载进取的)。 ITPUB个人空间 J(L/uJf0z
D
ETL 一般都是在晚上生产库结束后进行的,如果第二天发现 ETL 数据不对,怎么保证还能够抽取到昨天的业务数据? ITPUB个人空间1i7A(X#Pk"~LR/D
E
、一个指标的计算是经过多层次的抽取后完成的,怎么保证在抽取的过程中数值精度不丢失?怎么让业务人员理解其指标
5F9T4^|.AX6517
进行运算的过程( ETL 抽取的时提供的可是技术元数据,客户所关心的可是业务员数据)?

 

 

wxlmail2008

D 的 回答,好像会很麻烦吧,比如在分布式的情况下,抽取的数据是多个库的,而且源数据库(事物数据库)是很烦忙的,总不能停机处理把(特别是在金融,电信领 域),不过我知道他们是有备用数据库的(我不太清楚该术语,就用这个备用数据库代替了),就是一旦某一数据库宕掉,会自动启用另一数据库(这种备用数据库 也不只一个),是不是可以用备用数据库来抽取昨天的业务数据呢?
&M:p!raQ&J+gV5h6517 ITPUB个人空间*M)PSn'^](C
不知对不,偶想也不只一种方法吧,望 LZ 给予指正!

 

 

hskd-iceman

我的理解: ITPUB个人空间d1cu3t{
A
、如果数据源比较多而且字符集都不一样的话,字符集的转换的确是比较麻烦的,不过我想如果能够保证目标数据库的字符集是其它源数据库字符集的超集,或者是大部分源数据库字符集的超集,我想这样的麻烦可以减少很多。
/a5@*r AS?Vy5Q;S6517 B
、如果 ETL 处理的表比较多,那么除了用监控工具之外,我想不到有什么其它好的方法,或者可以写写过程之类的,让它定期运行,获取你关心的一些数据指标。 ITPUB个人空间'/6aYXx$RV%}
C
ETL 已经完毕了,并不是所有的数据能够重新加载进取的?这个我不是很明白为什么不能重新加载进取?
3VKkCV"]!v6517 D
、 这一点的话楼上的建议也不错,我们现在一般不到生产库抽取数据,数据都是在备机上取的,因为直接到生产库抽数据会影响到正常的业务办理,这种方式不是很 好。不过如果没有备机的话,那也只能从生产机上取了,不过不是很明白为什么不能抽到昨天的业务数据?如果要保证抽到昨天的业务数据,既然技术上实现不了, 那只能通过别的途径了,是否可能跟客户谈谈,改变这种方式? ITPUB个人空间;^wkJa7w
E
、这个也是个问题,有时我们只能引导客户。 ITPUB个人空间L/F/w4LH8]wJo ^],`
我的理解比较肤浅,希望大家都来讨论讨论。

 

 

Bq_wang

这个问题很简单,就是 ETL 过程中,你怎么保证数据的准确性,这个准确性包含两个方面:数据量的准确性,数值的正确性。
J Gy-clUB M6517 ITPUB个人空间*F8`4g+V�Y_.S Z
ITPUB个人空间!TH^/!g;N"Xm@B
这个问题看起来很简单,但是却包含很多内容: ITPUB个人空间F0C%s}wGS
A
、字符集的转换 —— 怎么将基于不同字符集的数据转换到目的数据库。   ITPUB个人空间K4p/}%eR
--
数据库超集
&ycT:Y.P/{ W)X/`6517 B
、数据量的准确性 —— 使用 ETL 工具的质量监控工具就那么准么?我可遇到过不准的情况哦。 ITPUB个人空间qF@Zy8mh6?/MT
--
这个很难,我建议在不符合标准的数据上做个记号,全部写入到数据仓库中 ITPUB个人空间4U?U#G[ V
C
discard 的数据怎么重新能够加载回目的数据库中( ETL 已经完毕了,并不是所有的数据能够重新加载进取的)。 ITPUB个人空间A(D@wUN&]
--
通上,不符合条件数据的维度值给以一些缺省值,一般情况下流水作业很难重新补登再入库的
g|Zi@8o7K8WV6517 D
ETL 一般都是在晚上生产库结束后进行的,如果第二天发现 ETL 数据不对,怎么保证还能够抽取到昨天的业务数据?
+F Bl�Y%H6517 --
做个好的脚本,只负责删除和处理某个时间段的数据 ITPUB个人空间%z lv(fmk j
E
、一个指标的计算是经过多层次的抽取后完成的,怎么保证在抽取的过程中数值精度不丢失?怎么让业务人员理解其指标 ITPUB个人空间nzhH!N/`~ |
进行运算的过程( ETL 抽取的时提供的可是技术元数据,客户所关心的可是业务员数据)?
H9Q4`ll8S/q5}-F6517 --
自己理解后,做好元数据维护和释义

 

 

innovate511

做个简单的补充,这些问题是最常见的 ETL 数据控制的问题,最好用治本的办法: ETL 工作流控制+控制表双重控制,同时 ETL 开发留出接口,让客户可以非正常情况下重新抽取(有的时候客户要求很怪, ETL 开发无法全部控制)。控制表我以前提到过,可以分为数据准确性控制表和 ETL 控制表两大类。而控制表有两种设计方法,一是由数据组成,二是直接存储逻辑(动态 SQL ),两者各有优势,数据组成的非常灵活,而逻辑组成的则方便管理 ,我都玩过,有机会可以一起探讨下。
N%C*} Hk*w3g+gB6517
Ur0u i(dm-k*}6517
保持数据精度不丢失,这得看客户的需求,所以人们说到数据集市层的时候,数据粒度可以比较大,但也可以小到最低粒度,这样数据精度可以一直完好保存。如果是客户技术人员,就给他看技术元数据,如果是最终用户,就看业务元数据,或者直接对前端 UAT ,最终用户一般只要他们要的报表或者分析准确,满足他们的需求就行了。

 

 

piliskys

估计这只是理论的解决,实际中应该是不好使的
iff,sGu6517
就说两个吧 ITPUB个人空间C�gx0wz(x;C7kp
c,
不符合条件数据的维度 -- 很多时候不符合条件的是五花八门的,什么情况都可能,所以无法预先知道哪些是不符合条件的,
j/k3E%`+V!U]eLdfY6517 d,
不是所有数据只是插入操作,在业务系统中更新操作的数据很多,而且不是所有都有时间字段的, 具体问题还是要具体分析 ITPUB个人空间1P�gEw1ye`
很多时候理论上是如此,事实却是另一面,这就是为什么有很多好的数据仓库方面的书籍而难有很好的数据仓库的实际项目

 

 

xx_adam

B ,我个人觉得对照业务系统数据记录条数和导入之后的记录条数进行比较,一致应该是准确的,不过 DW 中的表要建好主键约束
Q_1L3K-K:sSU)WKC6517 D,
一般情况下,业务系统会有一个时间戳,从昨天的时间戳重新抽取。 ITPUB个人空间W4Y$G{UX8dn
E,
在每一步的计算机中尽可能保留多的小数据位数据,不进行四舍五入

 

 

mingjian129

对照业务系统数据记录条数和导入之后的记录条数进行比较,如果一樣則很好辦,但是如果記錄數不一致的話,比較難去判斷哪些是已經導入的?哪些是沒有導入的?單純以時間戳的話是沒辦法去判斷的,而且如果從昨天的時間戳重新抽取的話,那么务必要刪掉已經導入的數據。

 

 

gushangzao007

D ETL 一般都是在晚上生产库结束后进行的,如果第二天发现 ETL 数据不对,怎么保证还能够抽取到昨天的业务数据? ITPUB个人空间6uNrr#BWeR�T
   
回复:呵呵,如果用户可以接受的话,我一般把 ETL 执行安排在第二天的凌晨开始,从第二天凌晨开始抽取第一天的数据。
e%H%Vuq/jc6517 E
、一个指标的计算是经过多层次的抽取后完成的,怎么保证在抽取的过程中数值精度不丢失?怎么让业务人员理解其指标
p*dqf(OM8Yw6517
进行运算的过程( ETL 抽取的时提供的可是技术元数据,客户所关心的可是业务员数据)?
Q8i&t1gzlP6517    
回复:我认为在 ETL 的 过程中不对数值型数据据进行四舍五入操作,可有效防止数据精度不丢失,至于客户想看到多少位的精度,我们可以在前端展现中对数据进行格式化。为了让业务人 员能更好的理解指标的运算过程,我们一般在展现层以文字或在线帮助的形式对可能会引起歧义的指标给出后台的计算公式,帮助用户更好的理解指标含义。

 

 

flywolf2000

ITPUB个人空间f"W7j+z^(Tbk
今天冒个泡说两句: ITPUB个人空间B%|W*wQm#g
对于 A 问题字符集 bq_wang 说的是很贴切的,一般来说为了确保安全该使用字符集的超集合,对于 Oracle 数据库来说,是可以转换 ITPUB个人空间 MuljM"gyL%F'z
字符集的,也就是说不同种字符集之间 Oracle 会自动给你转换,这个部分抽时间我传个最近整理的字符集 ppt ,大家看看
F"ccA'@,S6517
就知道了,但是我们这里讨论的不仅仅是 Oracle 数据库,这个时候你就要同时考虑操作系统字符集、客户端字符集、数据库
kD-BLJ!TD@*Dp6517
字符集甚至应用程序字符集的问题。而最关键的是要看你抽取的数据是否落地,并且在落地的同时有没有进行字符集的转换, ITPUB个人空间0U9m;oU._x
例如:如果从一个字符集的操作系统中导出来数据,传输过程中几次落地,但是仅仅是落地存储,即使落地的操作系统、客户 ITPUB个人空间}u:t5`)E
端的字符集再怎么相互不兼容,这也不会影响了源数据。一般来说都会在 ETL 前详细调查源的字符集以落地解析的字符集以及 ITPUB个人空间4mwA3[.OJ
目的地的字符集,如果这个过程是字符集的子集以及超级的话那当然最好了,如果不是那么就要评估数据的损失量或者制定 ASCII
&/J%M2}&C|qJ2X6517
的转换机制,因为字符集说白了就是将 存储为 ASCII 码,而这个 ASCII 在另个字符集展现中是什么样子的问题。 ITPUB个人空间^r-hl1O7S%vCv$`
原创于2008年06月06日,2009年10月22日迁移至此。
KY!P t~7H$V6517 ITPUB个人空间#F#E~/eD2iQ{d
B
数据量准确性问题,说实话至今好像还没有什么好的方法,因为 ETL 不是数据平移 ---- 用个 count 统计对比就能知道数据量是
,/%@b(S2F4oX6517
否正确,当一个指标是经过多次 join 、过滤、判断、计算以后就已经很难保证抽取过来的数据是否在量上是正确的,一般我这边 ITPUB个人空间5@r/L*`U4@;`0at
采取的方法是定义抽样检测,得出一定的概率,这个概率就算是指标体系的一个误差了。 ITPUB个人空间y]yeI)@.j!DGm�]3p
ITPUB个人空间/8/w"i s L
C bq_wang
和其他人说的都有道理,有些业务数据在当天做完 ETL EOD 以后是没有办法再重新单独抽取的,在这种情况下要么
7Uf*RR+C4h,M6517
制定手工更改抽取的指标;要么启用前一天业务数据备份 ,再另一个环境下在人为的干预下重新跑一次该模块的 ETL 流程。而对于一
)NLhE-F*a n�Xl'C6517
些仅仅是静态平移、简单清洗的数据当然就不用这么麻烦了。 ITPUB个人空间?s~_2SR+e7L"u

'TXWK*M6L l3J6517 D
这个问题上我发现大家的想法都不太对,一般来说对于生产库的一些关键性交易数据都是要每天在抽取的之前做一次逻辑的备份 ——ITPUB个人空间"z1Q J HSEaRx
就是类似于 create table table_name_2008_1_5 as select * from .... ,一旦第二天发现抽取问题,还有昨天的静态数据源;而
)`bM9g7o6} F5b6517
对于流水性质的数据来说我们就可以不用做 tmp 表而在第二天还能重新抽取了,但是对于那种可以删除流水的业务系统就有点
?Gf U0~)UPw6517
变态了: ——
PA L~*R9c:O-gq6517
)x(@"iN6_!f4V2Y6517 E
今天就先不说了,准备迷糊了,上面这些问题希望大家继续深层讨论,东西还是很多的。 ITPUB个人空间2NQR0U W2XU
ITPUB个人空间yl%x9ml'F
大家别仅仅就考虑我提出来的这 A--E 五个方面,可以集思广益,多谈谈大家在实际工作中遇到的问题。
MKIm$JTq9VvX4g6517 ITPUB个人空间 Fg(Uz%],N8X
好了,今天就罗嗦到这里,欢迎大家来拍砖头。

 

 

Bearingpoint_NO

这个问题看起来很简单,但是却包含很多内容: ITPUB个人空间x aZg7s+U%pb
A
、字符集的转换 —— 怎么将基于不同字符集的数据转换到目的数据库。
"II*VPO;x s9B6517 B
、数据量的准确性 —— 使用 ETL 工具的质量监控工具就那么准么?我可遇到过不准的情况哦。 ITPUB个人空间*I~Ty�s&Id6/
C
discard 的数据怎么重新能够加载回目的数据库中( ETL 已经完毕了,并不是所有的数据能够重新加载进取的)。
c1aL*Zh&O