使用SSIS进行数据清洗

原文:使用SSIS进行数据清洗

简介

    OLTP系统的后端关系数据库用于存储不同种类的数据,理论上来讲,数据库中每一列的值都有其所代表的特定含义,数据也应该在存入数据库之前进行规范化处理,比如说“age”列,用于存储人的年龄,设置的数据类型为INT类型。存入数据库的值是2000虽然看起来没有任何问题,但结合业务规则,这样的”Noisy”数据在数据分析过程中就会造成数据分析的结果严重失真,比如极大的拉高平均年龄。在真实的OLTP系统中,这类不该存在的数据往往会由于各种各样的原因大量存在,类似这种类型的数据都会在数据进入数据仓库之前,在预处理阶段进行清洗。

    上面举出的简单例子仅仅是一个违反业务规则的情况,但实际的情况会根据具体业务的不同而不同,并不是一个简单统一的过程就能够解决,文本列举了一些典型的需要数据清洗的场景和SSIS中的实现方式。

为什么不使用SQL语句进行处理?

    使用SQL语句来查询和处理这类问题是可行的,但使用SQL语句有其局限性,例如:

  • 假如数据源不是关系数据库呢?
  • 假如业务逻辑非常复杂,需要非常复杂的SQL语句呢,处理过程中的调试、日志如何处理?

    使用SSIS可以很好的解决上述问题,SSIS提供了基于图的数据流,并在处理过程中提供了调试、日志、查看转换中的数据的能力,并且SSIS包相较于SQL更适合于团队作业。

 

使用SSIS进行数据清洗

    下面是一些典型的数据清理作业,使用SSIS进行处理。

 

缺失默认值

    缺失默认值是最常见的一种需要数据清洗的一种情况,缺失默认值指的是数据库列中的值为“NULL”,而在数据分析中,该类为NULL的数据需要替换中符合业务逻辑的值,比如NULL出现在销售地区列可以替换成“其他”,出现在销售数据列可以替换成“未知”等。

    在SSIS中我们可以通过“派生列”任务来为缺失默认值的列添加默认值,本例中我们对Adventureworks示例数据库的Person.Address数据库的AddressLine2列进行替换,该列中为NULL的值我们统一替换成“无附加地址”,如图1所示。

图1.使用派生列替换NULL

 

    除了上述使用常量替换"NULL"值之外,我们也可以按照业务规则根据其他数据源的数据填补NULL值,图2中的例子是ProductCostHistory表中部分EndDate列为NULL,通过查找Product表的ModifiedDate列将为NULL的EndDate列中的值补全。

   

   图2.使用有条件拆分判断EndDate列值是否为NULL

 

语义转换

    有时候,某些列的值需要做语义上的转换,比如说某个产品的"产地"列为5,分析时很难知道5代表什么,因此可以去对应的表或文件进行查找来替换这个5,比如5代表河北。在SSIS中,实现该类转换可以类似图2中直接去表中查找,也可以为该查找表(5代表河北这张表)建立缓存,然后通过缓存进行引用查找。

    为了实现通过缓存做语义转换,我们首先设置两个步骤,第一步首先将查找表的数据导入缓存,第二步再对缓存进行查找从而实现语义转换。

    图3是总体图。

图3.语义转换

 

    首先将查找表的数据导入缓存,如图4所示。

图4.导入缓存

 

    然后通过缓存更新数据,如图5所示。

图5.使用缓存进行数据查找

 

数据类型转换

    当数据来自不同数据源时,不同类型的数据源数据类型不兼容可能导致报错。在SSIS中,可以使用“派生列”来实现数据转换,派生列允许写自定义公式实现比较复杂的转换,也可以通过数据转换任务实现简单的数据类型转换,从而使得不同数据源的数据兼容。如图6所示。

图6.数据类型转换

 

数据截断问题

    某些情况下,数据可能在传输过程中由于数据长度的限制导致数据截断,在SSIS中的解决办法是将截断或者出错的数据导入到一个中间表中待进一步处理,如图7所示。

图7.数据截断错误输出到另一个源

    在OLEDB源的配置如图8所示。

图8.OLEDB数据源设置

 

查找匹配失败

    在某些情况下,将多个数据源中的数据进行集成时,同一个语义的数据可能以不同的方式存储,比如一些数据源存的值为“北京”,而另一些数据源存的为“北京市”。解决该类问题的办法就是“模糊查找”任务。如图9所示。

   

图9.对数据进行模糊查找

 

    在图9中,我们对数据进行了模糊查找,设置匹配度大于0.5的为匹配,小于0.5的为不匹配,分别输出到不同的数据源中。从而帮助数据进行了统一。

 

违反业务规则

    在设计数据仓库时,很重要的一点是列中何种类型的值是合适的。比如值是否在业务范围之内,或者列中数据与其相关的数据结合是否有效(比如说结束日志不能小于开始日志)。对于该类数据导入到目标表之前应该进行清理,在SSIS中清洗的方式有很多,比如使用“有条件拆分”任务将不符合业务规范的数据进行剔除或处理,或导入stage表。这取决于业务类型。

 

小结

    本文简述了数据清洗的概念,并对一些常见的数据清洗场景进行了实现。使用SSIS进行数据清洗相较于其他方式有很大的灵活性和性能。

时间: 2024-08-03 07:42:32

使用SSIS进行数据清洗的相关文章

SQL Server 2005中的SSIS维护计划简析

SQL Server的每一个版本都已经逐渐变得越来越自我调整和自我维护了.然而,对于基本维护的需求,例如删除索引碎片,更新统计数据,检查数据库一致性,以及进行备份仍然是不会消失的.你可以想象一下,索引的维护就像是给你的汽车换油,备份就像是买保险.你可以没有保险,但是一旦你需要它,它就在手边.同样的,你的汽车可以在没有换油的情况下跑上几千公里,但是经常维护会产生更好的性能,并且可以让你的汽车寿命延续几年. SQL Server 2005把维护计划以SSIS包的方式予以实现,它为任务的定制提供更大的

如何灵活运用SQL Server 2005 SSIS变量

随着SQL Server 2005不断的推广和普及,越来越多的企业的决策支持项目采用了SQL Server 2005商务智能解决方案.本文就SSIS开发ETL(Extract-Transform-Load,数据抽取.转换.装载的过程)过程中SSIS用户变量的使用向读者作简单介绍. 一. SSIS变量简介 SSIS(SQL Server Integration Services,SQL Server整合服务)变量分为两种,一种是系统变量,一种用户定义的变量.系统变量包含有关包.容器.任务或事件处理

在SQL2005 轻松配置SSIS包

sql2005 在以前的DTS中,在包的开发.测试.发布迁移过程中有很多问题,典型的问题是你必须手动的确定包中的所有连接都指向一个实际存在的物理服务器 幸运的是,现在在SSIS中提供了这种问题的解决方案,那就是包配置包配置是一个动态改变你的SSIS对象和连接属性的一种机制,它把这些动态可以改变的信息保存在包的外部,有下面几种方法存储这些值并将其传送到包中: XML文件 环境变量 注册表键值 父包变量 下面我们将举例使用XML文件存储这些值 这个例子我们将会把一个文本文件导入到数据库的表中,并可以

SQL2005中SSIS的空目标适配器

sql2005 SQL2005中SSIS的空目标适配器 这个适配器使用非常简单且不用安装,主要用它来中止你的数据流,相当于空设备 添加适配器到工具栏 在工具栏中选择项1.在SSIS包中右键选择"Choose Items..." 2.定位并选择适配器在对话框中选择"SSIS Data Flow Items"栏,并选中它,单击OK 3. 现在你就可以在工具栏看到空适配器了 

SQL2005-深入了解SSIS中记录集的应用

sql2005|记录集 SQL2005-深入了解SSIS中记录集的应用 在本文,我将介绍如何产生记录集,并将利用记录集中的行和列干某些事情,比如当你想基于行遍历执行某项操作,这是非常有用的 产生记录集非常简单了,上文<SSIS中ExecuteSQL TASK组件>中就介绍了 好了,现在开始我们的准备工作 1.现在我们定义4个变量 ClosureDate 日期型数据 ,初始值为1/12/1999 Contactname 字符串型 emailaddress 字符串型 rsDetails 对象型 这

Sql2005如何用dtexec运行ssis(DTS)包

sql2005 dtexec运行ssis的方式一 首先在Business Intelligence中设计好包,并调试通过二   选用dtexec工具运行包(一)  打开 xp_cmdshell 选项  SQL Server 2005 中引入的 xp_cmdshell 选项是服务器配置选项,使系统管理员能够控制是否可以在系统上执行 xp_cmdshell 扩展存储过程.默认情况下,xp_cmdshell 选项在新安装的软件上处于禁用状态,但是可以通过使用外围应用配置器工具或运行 sp_config

通过设置 CheckPoints 检查点来增强 SSIS Package 流程的重用性

通常一个 ETL Package 是由多个控制流和数据流共同组成,有的时候 ETL 的步骤可能会比较多,整个流程执行下来的时间可能比较长.假设在 ETL Package 中包含5个Task,前3个Task执行超过1个小时,到了第4个Task的时候发生失败.如果下次执行的时候重新从第1个任务开始执行,那么又要花费1个小时等待 1-3 任务执行,无疑在效率上讲是非常低的.特别是在数据仓库的应用上,往往从数据源到Staging的过程中有千万级甚至亿级的数据要加载,加载完毕之后再进入到维度和事实表.如果

如何在 SSIS 中读取 SharePoint List

前言 由于项目需要, 我们会从SharePoint 上读取一些配置数据, 同时也有可能执行一些回写操作去更新SharePoint 的数据. 之前没有做过这样的操作, 有的也应该是通过 C# 编程去获取或者写入一些数据. 查阅了一些相关的文章, 自己也动手测试了一下如何在 SSIS Package 中访问SharePoint List 并将数据写入 SharePoint List. 两个操作 读取SharePoint List 的数据到数据库 从数据库中筛选一些数据然后插入到一个新的 ShareP

SSIS从理论到实战再到应用(4) 流程控制之For循环

在SSIS体系中,控制流可能经常会遇到,比如你取得一列数据,需要循环这列数据然后做相应的操作时,就需要用到循环,下面,我来操作两种循环方式,FOR循环和Foreach循环. 一,For循环 写过代码的知道,For循环的常用写法是这样的:For(var i = 0 ; i < 10 ; i++){  //do sth;}; 这里面包含三个动作,初使化循环量,设定循环的终止值,循环更新值.那我们相应的看一下For循环容器里面是否含有相应的动作: InitExpression => Var i  =