简介

    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进行数据清洗相较于其他方式有很大的灵活性和性能。

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

  1. 数据库使用SSIS进行数据清洗教程

    OLTP系统的后端关系数据库用于存储不同种类的数据,理论上来讲,数据库中每一列的值都有其所代表的特定含义,数据也应该在存入数据库之前进行规范化处理,比如说“age”列,用于存储人的年龄,设置的数据类型 ...

  2. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  3. FocusBI: SSIS 开发案例(原创)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/ ...

  4. FocusBI: SSIS体系结构(原创)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/ ...

  5. SSIS 包部署 Package Store 后,在 IS 中可以执行,AGENT 执行却报错

    可以执行 SSIS Package ,证明用 SSIS Package 的账户是可以执行成功的.SQL Server Agent 默认指定账号是 Network Service. 那么可以尝试一下将 ...

  6. SSIS 属性:ExecValueVariable

    有些Task组件执行完成之后,会产生输出结果,称作Execution Value,例如,Execute SQL Task在执行完成之后,会返回受影响的数据行数.Task组件的Execution Val ...

  7. Hawk 4. 数据清洗

    数据清洗模块,包括几十个子模块, 这些子模块包含四类:生成, 转换, 过滤和执行. 数据清洗可以通过组合多个不同的子模块,生成多样的功能,通过拖拽构造出一个工作流,它能够产生一个有限或无限的文档序列. ...

  8. SSIS 实例——将SQL获取的信息传递到Email中

    最近在为公司财务开发一个邮件通知时遇到了一个技术问题.原来我设计SSIS的是每天将ERP系统支付数据导出到财务支付平台后 Email 通知财务,然后财务到支付平台上进行支付操作.由于那个时候开发时间很 ...

  9. 介绍几种SSIS部署方式

    介绍 如果你已经开发完一个不错的SSIS包并且能够在你的本地完美的运行,每个任务都亮起绿色的通过标志.这时为了能够让这个包处理能够在指定时间运行,你需要将其发布到一个服务器上,并做好相关配置.作为开发 ...

随机推荐

  1. padding(内边距)、margin(外边距)、border(边框)

    元素的 padding 控制元素内容 content和元素边框 border 之间的距离. 元素的外边距 margin 控制元素边框 border 和元素实际所占空间的距离,如果你将一个元素的 mar ...

  2. (最小路径覆盖) News 消息传递 (hust OJ 2604)

    http://begin.lydsy.com/JudgeOnline/problem.php?id=2604   Description 总部最近打算向下面的N个工作人员发出了一条秘密消息.因为它是机 ...

  3. 用UEFI安装ArchLinux 20140105

    为了在E431上用UEFI安装Arch一个晚上重装了5,6次系统,整整做了一个通宵,还好是周六.今天刚好有时间正好 来总结一下.因为要用UEFI来安装,所以安装了两次之后发现UEFI环境变量不可用(用 ...

  4. 更改Xampp-sql的默认密码-配置appche运行环境

    用php编写的web应用程序,需运行在php的web容器中,其中apache server是一个针对php web容器,它是apache下的开源项目.通常要运行一个web程序,我们还需要安装数据库软件 ...

  5. [Leetcode][JAVA] Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  6. Hbase随笔2

    Hbase是建立在HDFS上的分布式数据库,下图是Hbase表的模型: Hbase这个数据库其实和传统关系数据库还是有很多类似之处,而不是像mongodb,memcached以及redis完全脱离了表 ...

  7. java基础5_数组

    一 数组是一个多个相同数据的集合.数组的长度一旦定义,将不能改变.数组的下标是从0开始的,到数组的长度-1结束. 1.数组的声明,初始化 int[] a = new int[3]{1,2,3}; in ...

  8. Inno调用dll --- 实现背景播放音乐

    Inno 播放音乐可以调用系统api函数mciSendString来实现,而mciSendString函数存在C:\Windows\System32\winmm.dll中,因此最终只要成功从该dll文 ...

  9. Nodejs学习路线图

    前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个.和所有人一样,我也从Web开发开始,然后到包管 理,再到应用系统的开发,最后开源自己的Nodejs项目 ...

  10. PHP学习第一天笔记——php的基本语法

    1.php嵌入到html中的方式 (1) <?php.....?> 标准风格(推荐) (2)<script language="php">......< ...