一种基于规则的数据清洗方案一种基于规则的数据清洗方案一种基于规则的数据清洗方案一种基于规则的数据清洗方案李俊奎,王元珍,李专华中科技大学数据库与多媒体研究所,湖北武汉(430074)E-mail:jkltk2000@126.com摘摘摘摘要要要要::::数据清洗是提高数据集成数据质量的一个重要手段。提出了一种基于动态规则的数据清洗方案AzszpClean,这种方法对各种清洗规则进行动态编译,将数据转换和数据清洗两者结合起来,强化清洗过程的描述能力,同时采用规则队列的方式实现批量规则匹配。实际应用表明,AzszpClean方法可以完成硬编码的功能,但具有更高的实现效率。关键词关键词关键词关键词::::数据清洗,动态规则编译,规则队列中图分类号中图分类号中图分类号中图分类号::::TP3311.引引引引言言言言在数据仓库构建过程中,对不同数据源数据的集成是其中的关键环节之一。而由于数据源或者由不同的用户定义,或者存在于不同的使用环境,来源于这些数据源的数据存在许多的不一致情形,对这些不一致/错误的数据进行处理是构建数据仓库的一个挑战。一般在数据集成过程中,会对数据进行转换和清洗,以提高数据的质量。数据清洗的过程是从大量原始数据中使用一系列逻辑判断,检查数据是否是符合数据仓库的数据,从而选择做进一步保留或过滤的动作。在数据清洗前又往往需要对数据进行转换,因此数据清洗的过程成为数据集成的一个重要步骤,同时也是其中的一个复杂的过程,迫切需要构建自动化工具来完成。当前对数据清洗已经有一些研究,文献[2]中提出了清洗规则的概念,指出可以使用定义清洗规则的方式完成数据清洗;文献[3]中综述了数据清洗中用到的相关技术;文献[4]中实现了一个领域驱动的数据质量工具;文献[6]中实现了一个基于规则引擎Drools的清洗方法,清洗规则的定义需要大量XML配置文件的操作;文献[5]中指出,目前数据清洗的主要问题是:对数据的检查和修复的动作或者使用硬编码,或者只是由人工来判断。在使用硬编码的方式下,需要清洗的数据定义不发生变化,而一旦变化则需要重新修改清洗部分的代码,重新编译,导致系统的可扩展性和灵活性较差,而且硬编码的清洗过程描述性较弱,难以应对复杂逻辑的数据清洗;在使用人工判断的情形下,只能处理较小的数据量,不仅增加了人们的工作量,而且质量和准确性较差,对于大规模的数据清洗则无能为力。本文在进行DM-Azszp(DM-Azszp是安全智能数据整合平台的项目代号,该项目包含一个数据集成的中间件)项目中,提出了一种AzszpClean的数据清洗方法,集数据转换和数据清洗为一体,采用清洗规则的方式完成,相比目前基于规则的数据清洗方案,本方案具备如下特点:(1)采用规则的动态编译方法。不仅具备坚实的编译理论基础,而且通过扩展编译语法的方式,容易实现规则的扩充和修改;(2)实现规则的零配置。与需要各种繁杂配置工具不同,规则采用的字符串脚本的方式,可以很容易存入数据库,不需要额外进行规则配置,方便了系统的部署以及在使用不同任务的使用;(3)实现规则队列,通过批量规则匹配,统一了规则的匹配和校验;基金项目基金项目基金项目基金项目:国家发展与改革委员会“安全智能数据整合平台开发及产业化”项目(项目编号[2005]538号)-2-(4)规则解析语法已经涵盖了数据的转换,省去了传统数据清洗前的数据转换步骤,过程更加清晰。本文其余部分如下组织:第2节给出数据清洗的相关定义和主要过程;第3节是AzszpClean的实现方案;在第4节给出AzszpClean的应用实例和效率测试;最后在第5节总结全文。2.数据清洗过程数据清洗过程数据清洗过程数据清洗过程2.12.12.12.1相关定义相关定义相关定义相关定义为了方便讨论,我们首先给出文中使用的一些定义。定义定义定义定义1原始数据原始数据原始数据原始数据(RawData)原始数据是来自数据源的数据,一般作为数据清洗的输入数据,文中后面用RawData表示原始数据;定义定义定义定义2干净数据干净数据干净数据干净数据(CleanData)干净数据也称目标数据(TargetData),即为符合数据仓库或上层应用逻辑规格的数据,也是数据清洗过程的结果数据,数据清洗过程从来自各种异构源的数据中产生出干净数据,如果数据源的数据已经被检查出是干净数据,数据清洗过程将会保留,文中后面用CleanData表示干净数据;定义定义定义定义3脏数据脏数据脏数据脏数据(DirtyData)与干净数据相对应,脏数据即为不符合数据仓库或上层应用逻辑规格的数据,数据清洗过程识别出是脏数据后,将会丢弃,文中后面用DirtyData表示脏数据;定义定义定义定义4清洗检查清洗检查清洗检查清洗检查(CleanCheck)检查数据是干净数据/脏数据的过程,可以用条件函数:condDboolean→表示:()conddatatrue=表示数据项data验证为脏数据()dataDirtyData∈;()conddatafalse=则表示数据项data验证为干净数据()dataCleanData∈;定义定义定义定义5清洗动作清洗动作清洗动作清洗动作(CleanAction)清洗过程进行清洗检查后的操作,可以有两种清洗动作:丢弃和保留,用BNF可以形式化表示为:::|Re;CleanActionDiscardserve=定义定义定义定义6清洗规则清洗规则清洗规则清洗规则(CleanRule)一条清洗规则定义了清洗检查和检查后采取的进一步的动作,可以用二元组的形式表示为:::,,CleanRulecondCleanAction=由此,一条清洗规则的执行过程为:(()){();}ifconddatathenClearActiondata(1)定义定义定义定义7数据清洗数据清洗数据清洗数据清洗(DataClean)数据清洗为从各种原始数据中产生出干净数据的过程,可以形式化表示为::DataCleanRawDataCleanData→2.22.22.22.2数据清洗过程数据清洗过程数据清洗过程数据清洗过程典型的数据清洗过程并不包括数据转换过程,于是数据清洗最终变为数据过滤过程,从数据源中来的数据(或者已经经过转换)在判断为脏数据后不存入数据仓库,直接丢弃。这种方式在如下情形下适用:(1)数据源中存放的数据就已经是规格良好(格式一致)的数据,数据清洗过程不需要进行格式转换,专注于进行数据内容上的清洗;(2)在数据清洗之前,额外增加数据转换的步骤,将不同格式的数据转化为同格式的数据,再进行数据清洗。本文考虑到在数据转换和数据清洗中规则的解析方式相似,于是采用将数据转换和典型意义上数据清洗过程结合起来,即数据清洗以原始的数据源数据作为输入,产生干净数据作为输出。这个过程可以用图1表示。图1数据清洗过程这种做法的优点是:(1)不对数据源数据进行假设,可以直接对数据源数据进行处理;(2)加强了数据清洗的功能,由于可以进行数据转换,数据清洗可以更加强大和贴近原始数据。3.AzszpClean方案方案方案方案3.13.13.13.1总体结构总体结构总体结构总体结构AzszpClean是数据集成中间件AzszpIntegration的清洗组件,它的总体结构如图2所示。从图2可以看出,AzszpClean以清洗规则为中心,用户通过规则界面制定好清洗规则后,规则将利用存储模块进行存储,从而可以在多次清洗过程中共用这些规则。清洗过程开始后,AzszpClean首先取出清洗规则,然后利用规则解析模块进行解析,解析完毕后的多棵内存语法树组成规则队列,在规则队列中进行数据清洗。原始数据集合通过规则队列中的数据转换、清洗检查和清洗动作,转化为干净数据的集合。3.23.23.23.2规则解析规则解析规则解析规则解析规则解析是AzszpClean中的关键一环,AzszpClean的清洗规则采用动态编译的方法,在进行数据清洗过程中产生动态语法树,通过在语法树上进行求值的方式完成数据转换和清洗检查。图2AzszpClean总体结构规则解析采用递归下降的语法分析技术,规则的文法如图3所示。为解决左递归问题[7],将产生式:|AAαβ→(2)重写为:|AAAAβαε→→(3)exp'ruleandExprr→exp'r→ORexp'andExprr|ε'andExprrelExprandExpr→'andExpr→AND'|relExpandExprε'relExpaddExprrelExpr→''|relExprRELOPaddExprrelExprε→RELOP→||=|=|!=|=|LIKE'addExprmulExpraddExpr→''|addExprADDOPmulExpraddExprε→ADDOP→+|-'mulExprtermmulExpr→''mulExprMULOPtermmulExprε→|MULOP→*|/!|()|()|termrulerulefuncparamlistfactor→_funcFUNCTIONNAMES→'paramlistruleparamlist→'paramlist→,'|ruleparamlistε|||factorcompIDstrnum→NULL'compIDidcompID→'DOT'|compIDidcompIDε→DOT→.(|)*idletterletterdigit→(_||)*|'(_||)*'strletterdigitletterdigit→()?numdigitDOTdigit→++letter→a|b|…|z|A|B|…|Zdigit→0|1|…|9图3清洗规则文法在规则的解析中,AzszpClean解决了如下问题:(1)图3的清洗规则文法中_FUNCTIONNAMES是所有清洗/转换中函数的名称。AzszpClean支持5类函数,分别是:字符串函数(lengthequals、等);数学函数(sintana、等);时间函数(yearPartisBefore、等);转换函数(replaceencode、等);常量函数(MathPIMathE、等)。由于函数名与id项()factor均处于term派生一级,因此容易发生冲突。AzszpClean规定所有支持的函数名为规则解析的保留字,id不可用函数名作为标识,而且函数名在id之前解析,解决了二者之间的冲突;(2)在文法中并没有标明函数的参数个数,分如下情形考虑:参数个数确定。首先验证参数个数,然后对类型进行试探转换,转换通过则进行计算(类似于进行参数类型隐式转换),如sin()param,首先试探param是否是int,是则转化为int处理,否则试探param是否是double,依此类推;参数个数不确定。参数不确定的情形出现在如(...)average等统计函数中,解析器要求参数类型一致,且使用一个向量存储所有的参数,用于变长参数函数的计算;(3)面向对象程序中的函数到面向过程程序中的函数迁移。AzszpClean中支持的函数都是面向过程式的函数类型,为利用已有的面向对象式的函数,采用类似于python等动态脚本语言的实现方式,函数名相同,增加第一个参数为对象的参数,如1.(2)timeisBeforetime转变为AzszpClean的函数声明为:(1,2)isBeforetimetime;(4)compID是复合标识符,由于关系数据库中的列、表的标识并不仅仅由其名字确定,还包括限定名,如一个表名可以有“..dbnameschematablename”的形式,因此与普通的标识符id不同,这里采用了复合的标识符名,用compID表示,同时支持普通标识符和复合标识符名。3.33.33.33.3规则队列规则队列规则队列规则队列清洗规则来