logo资料库

一种基于规则的数据清洗方案.pdf

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
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 -
分享到:
收藏