简介

    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. [UCSD白板题] Fractional Knapsack

    Problem Introduction Given a set of items and total capacity of a knapsack,find the maximal value of ...

  2. Java学习日记之 Java-IO流

    Java中的IO流在处理上分为字节流和字符流.字节流和字符流的区别 : 1.字节流读取的时候,读到一个字节就返回一个字节:  字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8 ...

  3. K最短路 A*算法

    POJ2449 Remmarguts' Date #include <iostream> #include <algorithm> #include <queue> ...

  4. redhat7 yum安装

    redhat 的更新包只对注册的用户生效,所以我们自己手动更改成CentOS 的更新包,CentOS几乎和redhat是一样的,所以无需担心软件包是否可安装,安装之后是否有问题,另外CentOS公司去 ...

  5. java HashMap那点事

    集合类的整体架构 比较重要的集合类图如下:   有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二 ...

  6. android内存优化

    背景 虽然android设备的配置越来越高,但是,由于android系统的机制导致(最主要是app程序的主线程不会真正退出而是在后台常驻内存中) ,这样手机中安装过多的app之后,导致内存被大量占用, ...

  7. 【转载】NuGet镜像上线试运行

    原文链接: http://www.cnblogs.com/cmt/p/nuget-mirror.html 在Visual Studio中的添加方法: 由于目前带宽有限,如果出现下面的问题,说明当前带宽 ...

  8. ASP.NET 5 入门 (3) – Logging

    ASP.NET 5 理解和入门 建立和开发ASP.NET 5 项目 使用自定义配置文件 ASP.NET 5 入门 (3) – Logging 前几天就关注到汤姆大叔的相关文档: 解读ASP.NET 5 ...

  9. asp.net identity 2.2.0 中角色启用和基本使用(二)

    建立模型 第一步:在Models文件夹上点右键 >添加>类     类的名称自定,我用AdminViewModels命名的 因为是讲基本使用,我这里不做任何扩展. 第二步:添加如下命名空间 ...

  10. Metrics-Java版的指标度量工具之一

    Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia.Graphi ...