在Kettle里使用参照表进行数据校验(流查询实现)

时间:2021-09-19 23:19:25
  参照表一个常见的用途就是做数据的查询和检验。提供一个输入字段,如果输入字段里的值没有匹配上,就给对应的数据行做一个错误标志。下面使用城市和邮政编码查询做个例子,演示如何使用计算器步骤和查询步骤来判断地址和邮政编码是否匹配。完整的转换如下图:
在Kettle里使用参照表进行数据校验(流查询实现)

  首先,需要一些输入数据,本例使用了“自定义常量数据”步骤,并添加一些测试数据作为输入,如下图:
在Kettle里使用参照表进行数据校验(流查询实现)

  第一个清洗步骤就是从邮政编码里提取数字,要使用计算器步骤。在计算器步骤选择“Return only digits from string A”,新增加一个字段保存这些数字,字段名使用像PC4_1这样有业务含义的字段名。然后就需要一个参照表。这里也是用“自定义常量数据”步骤来模拟一个参照表,如下图:

在Kettle里使用参照表进行数据校验(流查询实现)

在Kettle里使用参照表进行数据校验(流查询实现)

  根据PC4_1字段里的四位数字,再使用“流查询”步骤从参照表中查询城市名称。为了后面再处理没有查询到的数据,建议在查询失败时,使用一个容易识别的默认值,下图显示了完整的流查询步骤,这里设置的查询失败的默认值是“***unknown***”。
在Kettle里使用参照表进行数据校验(流查询实现)

  这里设置的默认值的前缀和后缀都是***,这样设置有两个目的:首先,检查数据的时候比较容易找到这些异常数据;其次,查询后在模糊匹配原始输入的城市名时,这个默认值不会和原来的任何城市名有相似度。后面模糊查询的目的主要是为了检查一些拼写或完整性错误。再使用另一个计算器步骤,把City和RefCity作为字段A和字段B,使用Jaro-Winkler匹配算法,把新生成的字段命名为cityscore。此时预览数据,可以看到如下图所示的结果。

在Kettle里使用参照表进行数据校验(流查询实现)

在Kettle里使用参照表进行数据校验(流查询实现)

  从数据里还不能判断出错误出在哪里:是邮政编码对了城市名错了?还是城市名对了邮政编码错了?为了得到结论,还要做一次相反的校验,“相反”校验是指根据城市名称再去参照表里找邮政编码,然后再和原始数据的邮政编码比较,如果邮政编码非常接近,就可以得出结论,是邮政编码拼写错误。