简介
由于拼写错误截断缺少或插入的标记空字段意外的缩略语和其他不规则问题实际的数据是有问题的 因此在数据仓库项目中很大一部分的时间和金钱都花费在了提取转换和加载 (ETL) 阶段 在 ETL 阶段新数据被清理标准化并使其与现有数据一致 在 Microsoft SQL Server? 中可用的模糊查找和模糊分组转换有助于使 ETL 过程在遇到若干种在实际数据中观测到的常见错误时更易复原 它们解决一般的匹配和分组问题而无需特定于域的规则和脚本的专家集合 通过为您的域自定义模糊查找和模糊分组您可以利用数据转换服务 (Data Transformation ServicesDTS) 设计器内的通用数据清理算法并避免创建复杂的自定义规则和代码
模糊查找使得您能够将输入记录与引用表中的无错的标准化的记录匹配 匹配过程对于在输入记录中存在的错误有复原功能模糊查找返回最相近的匹配并指出匹配的质量 例如由于输入数据中的录入错误或其他错误在一次新的销售交易中输入的客户信息(名称和地址)可能与包含所有当前客户的客户引用表中的任何记录都不完全匹配即使不存在完全匹配模糊查找也会从客户引用表返回最佳匹配记录并提供度量值以表明匹配质量
模糊分组使您能够标识一个表中的记录的组 — 在这个表中每个组都可能对应相同的实际实体 分组对在实际数据中观测到的常见错误有复原功能因为每组中的记录可能彼此不相同但彼此很相似 例如对于将一个客户引用表中描述每个实际客户的所有记录归类到一起模糊分组是很有用的
模糊查找和模糊分组为复杂的常遇到的数据清理问题提供易用的解决方案 尽管它们与现有的诸如 soundex基于规则的系统基于编辑距离的系统及全文搜索等现有方法有一些联系但是模糊查找和模糊分组有一些优势
模糊查找和模糊分组使用一个自定义的考虑编辑距离(例如hits与bit的距离为 )标记数标记顺序以及相对频率的独立于域的距离函数 结果与全文搜索相比模糊查找和模糊分组获得的辨别力要精细得多因为它们捕获了更详细的数据结构
由于它们完全是标记驱动的模糊查找和模糊分组不像 soundex 那样有依赖于语言的组件
因为它们不只使用编辑距离模糊查找和模糊分组不容易被变换误导而且与只使用编辑距离的方法相比能够检测出更高级的模式
模糊查找和模糊分组紧密集成在 DTS 中这使它们对 SQL Server 的 ETL 任务来说易于使用而且无需或只需很少的自定义编程
下面的部分提供了使用并了解模糊查找和模糊分组的分步指南并且包括了这些转换的一些实现和性能方面的内容这对用户来说很有用 本文意在通过更详细地解释模糊查找和模糊分组的某些方面来补充在线书籍 有关更多关于选项和配置参数方面的信息请参阅在线书籍项 这些项包括的信息有列宽层次结构标记处理选项以及其他有用的参数这些参数提供一些方法以加入可用来提高某些方案的准确性的域知识
模糊查找入门
模糊查找可以通过使用损坏的或不完整的字符串关键字查找大型表中的数据 例如如果您想要按名称和地址查找客户信息您可以使用模糊查找来查找这些信息即使您的输入与您的引用表中所存储的记录并不完全匹配 用于模糊查找的最简单的包是由包含一个源一个模糊查找转换和一个目标的单个 DTS 数据流任务组成(图 )
图 最简单的模糊查找包要构造最简单的模糊查找包打开 DTS 设计器
创建一个新的 ETL 项目添加一个新包单击 Data Flow 选项卡然后接受 add a data flow 项选项
在数据流图上从 Toolbox 拖动 OLE DB 源和目标转换然后通过使用一个模糊查找的实例连接它们
通过选择一个连接和包含有问题的数据的输入表将 OLE DB 源指向您的新数据 您的数据必须包含一些字符串列
双击 Fuzzy Lookup 打开自定义用户界面 (UI) 从 Reference table name 下拉菜单选择您希望转换的连接和表指向已经存储的引用数据
在 Columns 选项卡上将您想要比较的项从 Available Input Columns(来自 OLE DB 源)拖动到 Available Lookup Columns(来自引用表) 例如您可能希望将输入中的 StreetAddress 与引用表中的 Address 相比较
为 Available Lookup Columns 中的所有项选择复选框然后单击 OK
将 OLE DB 目标指向您可以为其编写新表的连接然后单击 New 接受默认创建语句现在您已经准备好运行模糊查找了
要运行您刚刚创建的包在解决方案资源管理器窗口中鼠标右击其名称然后选择 Execute
DTS 设计器运行此包并提供关于管道的详细的可视反馈 取决于引用数据的大小您可能会注意到在容错索引 (ErrorTolerant IndexETI) 创建时的延迟 ETI 是模糊查找在运行时使用的主数据结构
在 ETI 创建后所有输入行都被处理然后结果被写入到目标 通过显示由每个组件处理的行数DTS 设计器为您提供关于管道进度的反馈 您也可以通过鼠标右击模糊查找和 OLE DB 目标之间的连接器将一个 DataViewer 放置在管道上 这允许您实时看到那些模糊查找与您的输入行匹配的行 除了匹配元组模糊查找还输出可信度和相似性百分比 有关更多关于可信度和相似性百分比的信息请参阅本文后面的解释结果
最有效地使用模糊查找
运行模糊查找的主要步骤是创建 ETI执行查找和检查输出 下列部分提供了关于这些步骤的每一步的详细信息
了解容错索引
模糊查找通过索引在引用数据和引用行 ID 中出现的标记创建 ETI 如果您将 ETI 存储在了服务器上您可以通过从中选择一些行来查看其内容 每个行由一个索引标记和包含该标记的引用行 ID 序列组成 在地址示例中如果您的引用数据包含 NE th StETI 将包含 NEth 和St 的标记项 以下是 ETI 如何随引用数据而增长 在引用表中有越多的唯一标记和越多的行ETI 中就会有越多的项和越长的列表 有关更多关于 ETI 的大小如何随引用数据而增长的信息请参阅本文后面的了解性能 标记化过程是通过模糊查找自定义属性 delimiter string 控制的 例如如果您想要索引 NE而不是 N 和 E则请将句点从分隔符列表删除 结果是 NE 作为一个单独的标记在 ETI 中显示而且会在运行时作为一个单元被查找 由于分隔符的全局应用如 FirstAvenue 也作为一个单独的标记显示
由于 ETI 的构造成本因引用数据大小的增长而变得更加昂贵模糊查找提供一个选项可以将 ETI 存储在服务器上日后可以重新使用 这个选项使您能够避免在每次运行模糊查找时都重新创建一个 ETI 如果您的 ETI 会花费太多的时间而不能每次运行都重建考虑创建一次而在接下来的运行中对其进行重用 要做到这一点在 Reference Table 选项卡上选择 Store new index然后指定一个表名称
注 ETI 可能会变得相当巨大所以规划服务器空间可能是必要的 在最坏的情况下ETI 可能会是引用表的索引行中的数据大小的两倍
如果您想要存储 ETI 但是引用数据不时地更改您还可以启用 Maintain stored index 这个功能在您的 ETI 上安装一个触发器它检测对基础引用数据的修改 只要这样的修改发生此触发器将相应的更改传递到 ETI从而使其保持为最新 如果您不安装表维护对您的引用表所做的更改将在没有警告的情况下使任何关联的 ETI 无效
注 表维护功能在 Beta 版中不可用
在运行时发生了什么
在运行时模糊查找使用 ETI 查找其输入的最佳匹配 在确定最佳匹配时最重要的参数是 MinSimilarity 阀值 您可以通过使用模糊查找UI 来设置这个自定义属性 引用元组只有在其与输入足够相似时才会被返回 因此如果您设置了一个很高的相似性要求模糊查找考虑的候选也会较少而且结果可能是不返回任何匹配 如果您将 MinSimilarity 设置得低模糊查找将考虑更多的候选而更有可能找到一个匹配但搜索可能会用去更长的时间
匹配条件包括
为匹配给出的引用元组而需要对输入元组做的标记或字符插入删除替换以及重新排序的数量 例如输入 First Lane 很可能被认为比输入 NE st Ln & Leary Way 更接近引用 First Ln
来自引用表的标记频率 非常频繁的标记通常被认为几乎不会提供对匹配有用的信息 相对稀少的标记被认为是它们在其中出现的行的特性
设置正确的阀值取决于您的应用程序和数据的性质 如果您要求一个在您的输入和引用之间的相近的匹配您应该考虑为 MinSimilarity 设置一个大值如 如果您在进行一个研究性的项目您可能会对检查弱匹配与相近匹配一样感兴趣那么您应该将 MinSimilarity 设置为一个较低的值如 并没有可以用于确定这个范围的固定规则所以建议您对数据设置进行试验 查看几次运行的输出可以供设置最优值考虑 例如您执行第一次运行使用的阀值为 您观测到一个特定的输入与一个相似性为 的特定的输出匹配 如果对于您的应用程序来说此元组过于不相似(详细信息请参阅解释结果)第二次运行您可以将 MinSimilarity 设置为 从而排除与其过于不相似的匹配 在一个小的测