http://www.paper.edu.cn
AzszpClean:一种基于规则的数据清洗方案
一种基于规则的数据清洗方案
一种基于规则的数据清洗方案
一种基于规则的数据清洗方案
李俊奎,王元珍,李专
华中科技大学数据库与多媒体研究所,湖北武汉 (430074)
E-mail:jkltk2000@126.com
摘摘摘摘 要要要要::::数据清洗是提高数据集成数据质量的一个重要手段。提出了一种基于动态规则的数
据清洗方案 AzszpClean,这种方法对各种清洗规则进行动态编译,将数据转换和数据清洗
两者结合起来,强化清洗过程的描述能力,同时采用规则队列的方式实现批量规则匹配。实
际应用表明,AzszpClean 方法可以完成硬编码的功能,但具有更高的实现效率。
关键词关键词关键词关键词::::数据清洗,动态规则编译,规则队列
中图分类号::::TP331
中图分类号
中图分类号
中图分类号
1. 引引引引 言言言言
在数据仓库构建过程中,对不同数据源数据的集成是其中的关键环节之一。而由于数据
源或者由不同的用户定义,或者存在于不同的使用环境,来源于这些数据源的数据存在许多
的不一致情形,对这些不一致/错误的数据进行处理是构建数据仓库的一个挑战。一般在数
据集成过程中,会对数据进行转换和清洗,以提高数据的质量。
数据清洗的过程是从大量原始数据中使用一系列逻辑判断,检查数据是否是符合数据仓
库的数据,从而选择做进一步保留或过滤的动作。在数据清洗前又往往需要对数据进行转换,
因此数据清洗的过程成为数据集成的一个重要步骤,同时也是其中的一个复杂的过程,迫切
需要构建自动化工具来完成。
当前对数据清洗已经有一些研究,文献[2]中提出了清洗规则的概念,指出可以使用定
义清洗规则的方式完成数据清洗;文献[3]中综述了数据清洗中用到的相关技术;文献[4]中
实现了一个领域驱动的数据质量工具;文献[6]中实现了一个基于规则引擎 Drools 的清洗方
法,清洗规则的定义需要大量 XML 配置文件的操作;文献[5]中指出,目前数据清洗的主要
问题是:对数据的检查和修复的动作或者使用硬编码,或者只是由人工来判断。在使用硬编
码的方式下,需要清洗的数据定义不发生变化,而一旦变化则需要重新修改清洗部分的代码,
重新编译,导致系统的可扩展性和灵活性较差,而且硬编码的清洗过程描述性较弱,难以应
对复杂逻辑的数据清洗;在使用人工判断的情形下,只能处理较小的数据量,不仅增加了人
们的工作量,而且质量和准确性较差,对于大规模的数据清洗则无能为力。
本文在进行 DM-Azszp(DM-Azszp 是安全智能数据整合平台的项目代号,该项目包含一
个数据集成的中间件)项目中,提出了一种 AzszpClean 的数据清洗方法,集数据转换和数据
清洗为一体,采用清洗规则的方式完成,相比目前基于规则的数据清洗方案,本方案具备如
下特点:
(1)采用规则的动态编译方法。不仅具备坚实的编译理论基础,而且通过扩展编译语法
的方式,容易实现规则的扩充和修改;
(2)实现规则的零配置。与需要各种繁杂配置工具不同,规则采用的字符串脚本的方式,
可以很容易存入数据库,不需要额外进行规则配置,方便了系统的部署以及在使用不同任务
的使用;
(3)实现规则队列,通过批量规则匹配,统一了规则的匹配和校验;
基金项目基金项目基金项目基金项目: 国家发展与改革委员会“安全智能数据整合平台开发及产业化”项目(项目编号[2005]538 号)
- 1 -
http://www.paper.edu.cn
(4)规则解析语法已经涵盖了数据的转换,省去了传统数据清洗前的数据转换步骤,过
程更加清晰。
本文其余部分如下组织:第 2 节给出数据清洗的相关定义和主要过程;第 3 节是
AzszpClean 的实现方案;在第 4 节给出 AzszpClean 的应用实例和效率测试;最后在第 5 节
总结全文。
2. 数据清洗过程
数据清洗过程
数据清洗过程
数据清洗过程
2.1 2.1 2.1 2.1 相关定义相关定义相关定义相关定义
为了方便讨论,我们首先给出文中使用的一些定义。
定义定义定义定义 1 原始数据原始数据原始数据原始数据(Raw Data) 原始数据是来自数据源的数据,一般作为数据清洗的输入
数据,文中后面用 RawData 表示原始数据;
定义定义定义定义 2 干净数据干净数据干净数据干净数据(Clean Data) 干净数据也称目标数据(Target Data),即为符合数据仓库
或上层应用逻辑规格的数据,也是数据清洗过程的结果数据,数据清洗过程从来自各种异构
源的数据中产生出干净数据,如果数据源的数据已经被检查出是干净数据,数据清洗过程将
会保留,文中后面用 CleanData 表示干净数据;
定义定义定义定义 3 脏数据脏数据脏数据脏数据(Dirty Data) 与干净数据相对应,脏数据即为不符合数据仓库或上层应用
逻辑规格的数据,数据清洗过程识别出是脏数据后,将会丢弃,文中后面用 DirtyData 表示
脏数据;
定义定义定义定义 4 清洗检查清洗检查清洗检查清洗检查(Clean Check) 检查数据是干净数据/脏数据的过程,可以用条件函数
:
表示:
boolean
→
cond D
cond data
(
)
= 表示数据项 data 验证为脏数据 (
true
data DirtyData
∈
)
;
cond data
(
)
=
false
则表示数据项 data 验证为干净数据 (
data CleanData
∈
)
;
定义定义定义定义 5 清洗动作清洗动作清洗动作清洗动作(Clean Action) 清洗过程进行清洗检查后的操作,可以有两种清洗动
作:丢弃和保留,用 BNF 可以形式化表示为:
CleanAction
::
=
Discard
| Re
;
serve
定义定义定义定义 6 清洗规则清洗规则清洗规则清洗规则(Clean Rule) 一条清洗规则定义了清洗检查和检查后采取的进一步的
动作,可以用二元组的形式表示为:
>
,
cond CleanAction
CleanRule
=<
::
,
由此,一条清洗规则的执行过程为:
(
))
(
if cond data then ClearAction data
定义定义定义定义 7 数据清洗数据清洗数据清洗数据清洗(Data Clean) 数据清洗为从各种原始数据中产生出干净数据的过程,
);}
{
(
(1)
可以形式化表示为:
DataClean RawData
:
→
CleanData
2.2 2.2 2.2 2.2 数据清洗过程
数据清洗过程
数据清洗过程
数据清洗过程
典型的数据清洗过程并不包括数据转换过程,于是数据清洗最终变为数据过滤过程,从
数据源中来的数据(或者已经经过转换)在判断为脏数据后不存入数据仓库,直接丢弃。这种
方式在如下情形下适用:
(1)数据源中存放的数据就已经是规格良好(格式一致)的数据,数据清洗过程不需要进行
格式转换,专注于进行数据内容上的清洗;
- 2 -
(2)在数据清洗之前,额外增加数据转换的步骤,将不同格式的数据转化为同格式的数
据,再进行数据清洗。
本文考虑到在数据转换和数据清洗中规则的解析方式相似,于是采用将数据转换和典型
意义上数据清洗过程结合起来,即数据清洗以原始的数据源数据作为输入,产生干净数据作
http://www.paper.edu.cn
为输出。
这个过程可以用图 1 表示。
图 1 数据清洗过程
这种做法的优点是:
(1)不对数据源数据进行假设,可以直接对数据源数据进行处理;
(2)加强了数据清洗的功能,由于可以进行数据转换,数据清洗可以更加强大和贴近原
始数据。
3. AzszpClean 方案方案方案方案
3.1 3.1 3.1 3.1 总体结构总体结构总体结构总体结构
AzszpClean 是数据集成中间件 AzszpIntegration 的清洗组件,它的总体结构如图 2 所示。
从图 2 可以看出,AzszpClean 以清洗规则为中心,用户通过规则界面制定好清洗规则
后,规则将利用存储模块进行存储,从而可以在多次清洗过程中共用这些规则。
清洗过程开始后,AzszpClean 首先取出清洗规则,然后利用规则解析模块进行解析,
解析完毕后的多棵内存语法树组成规则队列,在规则队列中进行数据清洗。原始数据集合通
过规则队列中的数据转换、清洗检查和清洗动作,转化为干净数据的集合。
3.2 3.2 3.2 3.2 规则解析规则解析规则解析规则解析
规则解析是 AzszpClean 中的关键一环,AzszpClean 的清洗规则采用动态编译的方法,
在进行数据清洗过程中产生动态语法树,通过在语法树上进行求值的方式完成数据转换和清
洗检查。
图 2 AzszpClean 总体结构
规则解析采用递归下降的语法分析技术,规则的文法如图 3 所示。为解决左递归问题
[7]
,
将产生式:
重写为:
→
A
Aα β
|
(2)
- 3 -
http://www.paper.edu.cn
A
A
→
→
'
β
'
A
α
' |
A
ε
(3)
→
andExpr
rule
exp 'r → OR
exp '
r
andExpr
exp '
r
| ε
relExpr andExpr
'
→
andExpr
andExpr → AND
'
→
relExp
addExpr relExpr
'
relExp andExpr ε
' |
→
'
RELOP addExpr relExpr ε
' |
relExpr
RELOP → > | < | >= | <= | != | = | LIKE
addExpr
→
mulExpr addExpr
'
ADDOP mulExpr addExpr
ε
' |
→
'
addExpr
ADDOP → + | -
→
→
'
mulExpr
MULOP → * | /
mulExpr
term mulExpr
|
MULOP term mulExpr ε
'
'
term
→
!
rule
| (
rule
) |
func paramlist
(
) |
factor
func
→
_
FUNCTION NAMES
rule paramlist
→
'
paramlist
paramlist → ,
'
rule paramlist
factor
→
compID str num
|
|
|
compID id compID
→
'
ε
' |
NULL
→
id compID ε
' DOT
' |
compID
DOT → .
id
→
letter letter digit
(
|
)*
→
|
|
+
→
str
"(_ |
letter digit
digit DOT digit
) *" | '(_ |
letter digit
num
letter → a | b| … | z| A | B | … | Z
digit → 0 | 1|…|9
)?
+
(
)*'
图 3 清洗规则文法
在规则的解析中,AzszpClean 解决了如下问题:
(1)图 3 的清洗规则文法中
_
FUNCTION NAMES 是所有清洗/转换中函数的名称。
AzszpClean 支持 5 类函数,分别是:
等);
、
字符串函数( length equals
数学函数( sin
tana、 等);
时间函数( yearPart
转换函数( replace
encode
常量函数( MathPI MathE
由于函数名与 id 项 (
、
、
、
isBefore
等);
等);
等)。
factor 均处于 term 派生一级,因此容易发生冲突。AzszpClean 规定
)
所有支持的函数名为规则解析的保留字, id 不可用函数名作为标识,而且函数名在 id 之前
- 4 -
解析,解决了二者之间的冲突;
http://www.paper.edu.cn
(2)在文法中并没有标明函数的参数个数,分如下情形考虑:
参数个数确定。首先验证参数个数,然后对类型进行试探转换,转换通过则进行计
param ,首先试探 param 是否是 int ,是则转化为
)
算(类似于进行参数类型隐式转换),如 sin(
int 处理,否则试探 param 是否是 double ,依此类推;
参数个数不确定。参数不确定的情形出现在如
average 等统计函数中,解析器要
(...)
求参数类型一致,且使用一个向量存储所有的参数,用于变长参数函数的计算;
(3)面向对象程序中的函数到面向过程程序中的函数迁移。AzszpClean 中支持的函数都
是面向过程式的函数类型,为利用已有的面向对象式的函数,采用类似于 python 等动态脚
本语言的实现方式,函数名相同,增加第一个参数为对象的参数,如 1.
time isBefore time 转
2)
(
变为 AzszpClean 的函数声明为:
isBefore time time ;
2)
1,
(
(4) compID 是复合标识符,由于关系数据库中的列、表的标识并不仅仅由其名字确定,
还包括限定名,如一个表名可以有“
dbname schema tablename ”的形式,因此与普通的标识
.
.
符 id 不同,这里采用了复合的标识符名,用 compID 表示,同时支持普通标识符和复合标识
符名。
3.3 3.3 3.3 3.3 规则队列规则队列规则队列规则队列
清洗规则来源于复杂的商业逻辑和特定语义下的应用环境,因此对于一个原始数据集,
可能不止一条清洗规则,虽然前面的清洗规则解析支持各种复杂的清洗规则定义,且这样对
清洗规则的存储带来益处(减少规则的存储量),但是有如下原因可能需要定义多条清洗规
则:
(1)将所有的商业逻辑都定义在一条清洗规则上,会使该清洗规则过于复杂,既不容易
修改,同时也由于过多的逻辑,容易使定义规则的用户难以准确定义规则;
(2)仅单条规则的解析后语法树将比较大,数据转换/清洗检查/清洗动作等多个操作混杂
其中,一方面使数据清洗过程的处理效率降低,另一方面人为导致数据清洗过程难以理解;
(3)定义成多条清洗规则,分散了语法树的大小,结构明晰,且容易通过增删规则,从
而实现整个清洗过程的修改。
基于以上原因,AzszpClean 中允许定义多条清洗规则,对于同一原始数据集上所有的
清洗规则,引入规则队列以组合。
规则队列中的清洗规则是具有丢弃动作的规则,与单条清洗规则的清洗过程不同,规则
队列的清洗过程是过滤过程,只将符合要求的数据进行过滤(不放入结果数据集),实现的
过滤条件是:
(
if cond data
1(
Discard data
) || ... ||
condn data
);
(
(
)){
(4)
}
原始数据经过规则队列,转化为干净数据,整个过程如图 4 所示。
- 5 -
http://www.paper.edu.cn
构造规则队列
构造规则队列
构造规则队列
==
{
Discard
)
rule CleanAction
.
构造规则队列::::
1. Initialize empty ruleQueue ;
2. Fetch all clean rules Srule in one task;
3. for each rule in Srule {
4. if (
5. parse rule ;
6. add rule to ruleQueue ;
7. }
8. }
清洗过程清洗过程清洗过程清洗过程::::
1. Initialize empty CleanData ;
2. for each d in RawData {
3.
4. for each rule in ruleQueue {
5. if (
6.
7. }
8. }
9. if (!
10.
11. }
12. }
13. return CleanData ;
isFilter {
CleanData
.
true←
;
rule cond d {
( ))
CleanData
false←
;
isFilter
isFilter
break;// discard
)
←
∪
{ }
d
;
图 4 规则队列进行数据清洗的过程
4. 应用实例应用实例应用实例应用实例和效率测试
和效率测试
和效率测试
和效率测试
本节我们给出 AzszpClean 的应用实例,并对其清洗效率,尤其是多个具备复杂逻辑的
清洗规则条件下的效率进行测试,以验证其满足实际数据清洗应用的要求。
实验环境为 PC 机 2 台,二者之间用 100M Ethernet 连接,一台 PC 为数据源所在机器,
另一台 PC 为清洗和集成系统所在机器,两 PC 机器的配置相同,均为 Microsoft Windows®
2000 Server, 40G 硬盘,256M 内存,PIII-866CPU,集成系统采用的是 DM-Azszp 集成组件,
数据来源为 TPCH[1]
基准测试。数据源和目的源均采用 DM5.6 安全版本作为数据存储的
DBMS。
限于篇幅,仅给出其中一个数据表中的部分信息,如表 1 所示。
表 1 测试数据(部分)
custkey
001
002
003
name
‘c1’
‘c2’
‘c5’
addr
‘a1’
‘a2’
‘a2’
nationkey
103
105
103
sex
‘F’
‘M’
‘M’
实验一实验一实验一实验一:硬编码与 AzszpClean 过滤规则的编码效果。
过滤规则:
(1)name=‘c2’;//过滤 c2
(2)nationkey=custkey+100;
(3)replace(sex, ‘F’, ‘女’) = ‘0’; //F->女
(4)replace(sex, ‘M’, ‘男’) = ‘男’;//M->男,过滤男
- 6 -
http://www.paper.edu.cn
部分过滤结果如表 2 所示。
表 2 清洗结果(部分)
custkey
001
name
‘c1’
addr
‘a1’
nationkey
103
sex
‘女’
用 AzszpClean 的过滤规则四条字符串即可,而硬编码的方式需要用类似如下的判断语
句:
if ( name.equals(“c2”) ) &&
(nationkey == custkey + 100 ){
// discard;
}
if ( sex.equals(“F”)) {
sex = “女”;
if ( sex.equals(“0”)){
// discard
}
}
if ( sex.equals(“M”)) {
sex = “男”;
if( sex.equals(“男”)) {
// discard
}
}
由此可见,硬编码方式不仅容易引入错误,而且修改起来相当困难,对不同的应用难以
复用。而 AzszpClean 的方式只需要定义几条规则即可,极大地方便了清洗的定义过程。
实验二实验二实验二实验二::::硬编码与 AzszpClean 方式的清洗效率以及随数据量增加的扩展性。
增加数据量来测试清洗的效率,规则数为 5,结果如图 5 所示。由此可见,由于需要进
行规则解析,AzszpClean 在数据量较小时效率略低于硬编码方式,但是随着数据量增大,
这种差距变得不明显。
)
s
(
间
时
60
40
20
0
0.1
1
2
3
4
5
6
记录数(M)
HardCoding
AzszpClean
图 5 清洗效率随数据量的改变
实验三实验三实验三实验三::::硬编码与 AzszpClean 方式随规则增加的扩展性。
增加规则数来测试清洗的效率,记录数为 6000,结果如图 6 所示。结果表明,规则的
增加对硬编码和 AzszpClean 的效率影响基本一致,AzszpClean 达到了硬编码的处理效率。
但是 AzszpClean 更清晰地表达了清洗逻辑,更加容易为用户所接受。
- 7 -
http://www.paper.edu.cn
)
s
(
间
时
150
100
50
0
5
6
7
8
9
10
规则数
HardCoding
AzszpClean
图 6 清洗效率随规则数的改变
5. 结束语结束语结束语结束语
本文提出了一种动态规则编译的数据清洗方案,将各种清洗逻辑用规则的方式描述和存
储,进行清洗时进行规则编译,在语法树上进行清洗检查。对同源数据集,使用规则队列对
多个规则进行组合,批量进行数据清洗。实验结果表明,这种方案具备描述复杂清洗逻辑的
能力,同时具备零配置、可扩展的特点。该方案已经在 DM-Azszp 项目中成功实施。为配合
数据集成,我们还为转换和清洗设计了辅助的规则定义工具,方便用户进行抽取、转换和清
洗操作,实际运行效果良好。
致谢致谢致谢致谢 对 DM-Azszp 项目组在项目进行中的出色表现表示感谢。
参考文献参考文献参考文献参考文献
[1] TPCH[EB/OL].http://www.tpc.org,
[2] Duncan K, Wells D. A rule based data cleansing [J]. Journal of Data Warehousing, 1999, 4(3):2
[3] Heiko Muller, Johann-Christoph Freytag. Problems, Methods, and Challenges in Comprehensive Data
Cleansing [M]. Technical Report. HUB-IB-164, Humboldt-Universitat zu Berlin, Institute fur Informatik,
2003.13~23.
[4] Dominik Luebbers, Udo Grimmer, Matthias Jarke. Systematic Development of Data Mining-Based Data
Quality Tools[C]. In: Proc. of the 29th Very Large Data Bases Conf.(VLDB), Berlin, Germany,
2003.548~559
[5] Rahm E., Do Honghai. Data cleaning: problems and current approaches [J]. Data Engineering. 2000, 23(4)
[6] 叶舟, 王东. 基于规则引擎的数据清洗[J]. 计算机工程, 2006, 32(23):52~55
[7] Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman 著, 李建中,姜守旭译. Compiler Principles, Techniques, and
Tools [M]. 中国机械工业出版社. 2003.116~118.
- 8 -