十三.SSIS数据转换组件_模糊分组转换[转载][补充]
模糊分组转换执行数据清理工作。它首先查找可能重复的行,然后选择要在对数据进行标准化的过程使用的规范数据行。模糊分组的任务编辑器有下面三个标签:
1. 连接管理器
使用列表框选择现有的 OLE DB 连接管理器,或使用“新建”按钮创建新的连接。
该功能主要是为模糊分组转换算法完成工作所需而需要创建临时 SQL Server 表。创建的表可能会很大,因此在生产服务其只有有限的可用磁盘空间时,因该考虑将模糊分组转换连接到Sql Server 的非生产实例中。则此转换性能可能会提高。
2 列
该选项卡可以设置 用于对带有重复值的行进行分组。如图:
若要配置该转换,您必须选择要在确定重复项时使用的输入列,而且必须为每列选择匹配类型(模糊匹配或完全匹配)。完全匹配保证只对该列中具有相同值的行进行分组。完全匹配可以应用到除 DT_TEXT、DT_NTEXT 和 DT_IMAGE 之外的任何 Integration Services 数据类型的列。模糊匹配对具有相似值的行进行分组。近似匹配数据的方法基于用户指定的相似性得分。在模糊匹配中,只能使用具有 DT_WSTR 和 DT_STR 数据类型的列。
在图中最下面每列表示的含义如下:
列名
说明
输入列
在可用输入列中选择要分组的输入列
输出别名
为相应的输出列输入一个描述性的名称,默认为输入列名
组输出别名
为包含分组重复项的规范值得列输入一个描述性名称。默认为输入列名后加_clean
匹配类型
两种,Fuzzy-模糊匹配,Extract-完全匹配
最低相似性
设置相似性阈值。改值越接近1,查找值与源值重复可能性越高
相似性输出别名
为包含所选联接相似性得分的新输出列指定名称.如果将该值保留空,将不会创建输出列.
数字
指定比较列数据时前导数字和尾随数字的重要性.Neither-前导数字和尾随数字都不重要。Leading-只有前导数字重要。Trailing-只有尾随数字重要。LeadingAndTrailing-前导和尾随数字都重要
比较标志
包含忽略大小写、忽略假名类型、忽略符号、忽略字符宽度等等。
3 高级选项卡
在高级选项卡中可以指定输入列和输出列、设置相似性阈值和定义分隔符。见下图
了解这些信息后,我们现在就已例子来介绍如何使用模糊分组转换功能。假设人事部在输入每个员工的时候会有一些笔误。这里我们使用模糊分组来得到最标准的职位名称和每个员工的职位和这个标准的名称的相似度。
1.在E:\BI资料\IntegrationServices文件下创建一个名为“EmployData”的文档。文档内容如下:
2.创建一个名为”FuzzyGroupDemo”的包,在控制流界面拖放一个DataFlow任务。然后在联接管理器界面创建一个名为“EmployData”的平面文件联接器,连接上面创建的txt文件。
3.在常规选项卡中设置格式属性为右边未对齐(Ragged Right),代码页属性设置为1252(ANSI-拉丁语I)。其他设置参考如下图:
4. 在列选项卡中点击列边界分别在第5个字符和第28个字符处点击放置两个分割线如图。
5. 点击高级标签设置TITLE的OutputColumnWidth为50,保存连接。
6. 在数据流选项卡中拖放一个平面文件数据源。平面文件连接器属性设置为EmployData。
7. 拖放一个模糊分组转换任务。并将于平面文件源连接,箭头指向模糊转换任务。
8. 在模糊分组转换任务中的连接管理器属性中单击新建按钮。创建一个OLE DB连接管理器。用于连接AdventureWorks数据库。
9. 在列属性中,选择Title列做为输入列,其他默认输入。如图:
10. 在高级选项中,相似性阈值设置为0.5,其他都是默认.
11. 拖放一个OLE DB目标源,设置OLE DB连接管理器为刚才创建的数据库连接器。数据访问模式设置为表或试图-快速加载、单击新建,弹出对话框
对框中的sql脚本做如下设置:
CREATE TABLE [FuzzyGroup] (
[key_in] int primary key,
[key_out] int,
[score] real,
[EMPID] varchar(5),
[TITLE] varchar(50),
[LNAME] varchar(50),
[TITLE _clean] varchar(50),
[_Similarity_TITLE] real
)
然后单击确定。
12. 单击映射选项卡。做如下设置。
13执行包。成功后如下图:
13. 查看结果,在AdventrureWorks数据库中的表FuzzyGroup中查看结果如下:
OK,模糊分组转换功能介绍完毕。
补充,按照上述流程执行包可能会发上如下发生字符集一致问题(类似错误:Data Flow Task [OLE DB Destination [551]] 出错: 由于为列“EMPID”指定了多个代码页(1252 和 936),无法处理此列。) .可采用下面的解决方案
解决方案:
1、LocaleID:把相关包 /组件/连接 的设置一样都设置成"中文(中华人民共和国)"或者"英语(美国)"
2、AlwaysUseDefaultsCodePage设置为"True"
3、DefaultCodePage:设置为“1252”(对应LocaleID的"英语(美国)")或者“936”(对应LocaleID的"中文(中华人民共和国)")以保证组件、包、连接都一致,数据列的CodePage的都一致(要么都是1252,要么都是936)