作者:石明瑾于 2017年07月20日 发布在分类 / 开发技术 / BigData 下,并于 2017年07月20日 编辑
    kettle进行数据清洗

       1167

       0


    数据清洗步骤
    • 利用Calculator计算器进行数据清洗工作相关的选项
    • Replace in string字符串替换步骤
    • Fuzzy match模糊匹配步骤
    • Stream lookup流查询步骤使用参照表

      数据清洗步骤

      Kettle 里没有单一的数据清洗步骤,但又很多的步骤组合起来可以完成数据清洗的功能。(也可以使用”表输入”步骤里的可自定义的sql语句来做一些清洗工作,只抽取出必要的数据再传递给后面的步骤。但要注意,SQL 语句太复杂会使以后的维护工作比困难。当然我们也可以把数据原样读出来然后使用 Kettle 步骤转换,这里需要用户在效率和维护性之间平衡。) 
      下面举了两个例子

      利用“Calculator(计算器)进行数据清洗工作相关的选项”

      • ISO8601星期和年份数字:美国以外的很多国家使用不同的基于ISO8601标准的星期数字。不是所有的数据库都能从日期类型获得正确的星期和年份数据,所以计算器步骤里的这个功能很有用

      • 大小写转换:首字母大写,全部大写,全部小写可以让字符串的大小写统一。

      • 返回/移除数字:这个功能可以把既包含数字也包含字母的字符串拆分成数字和字母部分。例如,荷兰的邮政编码就是这样的字符串,它包含四位数字和两位字母(如1234AB)

    • 由于实践过后发现此步骤难度不是很大,所以在此不浪费篇幅来描述它。

      “Replace in string(字符串替换)”步骤

      下面的转换来自于官方的例子: 
      (…\data-integration\samples\transformations\Replace in string - Simple example.ktr)

      这里写图片描述

      Generate Rows:


      下面是步骤内容和预览数据,也就是说这两个字段分别生成一百万条。
      这里写图片描述

      下面才是重点

      Replace in string:

      这里写图片描述

      我们先看一下最后替换后的结果然后对比来看 
      (最后这个dummy步骤稍后说到官方例子时会给出具体说明)

      这里写图片描述

      这里我们一目了然:输入流字段也就是想要被替换的字段名字,输出流字段就是替换后的新的字段名字,是否使用正则表达式是这个步骤中特别强大的功能,相比后面的功能比如单纯地使用“搜索”字段,“使用…替换”,正则更灵活更强大。设置为空串就是如果搜索到了相应字段那么设置为空

      另外x1和x2都比较简单,唯一需要注意的就是x3,是在字段中每个字符的前后都加上那个字符,不过感觉这个用法不是很常用。=。=

      “Fuzzy match(模糊匹配)”步骤

      注:此步骤在“转换”“查询”

      在此之前我们先了解一下

      Kettle里的字符串匹配算法:

      kettle里有两个地方能找到相似度算法“Calculator”步骤和“Fuzzy match”步骤偶这两个步骤里的相似度算法几乎一样,但是工作方式不一样;“Calculator”步骤比较一行里的两个字段,而“Fuzzy match ”步骤使用查询的方式,从字典表中查询出相似度在一定范围内的记录。我们在使用这些步骤和算法之前,最好能理解这些算法的概念和用途。打开“Fuzzy match”步骤,选中算法列表,可以看到有很多可用的算法,如“Damerau-Levenshtein”,”Jaro Winkler”,”Double Metaphone”。这些算法的共同点就是用来做字符串匹配。但是他们的工作方式不一样,所以不同算法适合做不同的工作,如排重之类的工作。下面解释一下这些算法。

      • Levenshtein和Damerau-Levenshtein:编辑一个字符串到另一个字符串需要多少步骤,根据步骤数,来计算两个字符串之间的距离。第一个算法里的编辑步骤只包括插入字符,删除字符,更新字符,第二个算法里还包括调换字符位置的步骤。需要的最少步骤数就是最后的结果,例如”CASTERS”和“CASTRO”这两个字符串的距离就是2(步骤1:删除字母E;步骤2:把字母S替换成O)

      • Needleman-Wunsch: 这个算法主要用于生物信息学领域,以差异扣分的方法来计算距离,上面的CASTERS和CASTRO的距离是-2

      • Jaro和Jaro-Winkler: 计算两个字符串的相似度,结果是介于0(完全不一样)到1(完全一样)之间的小数。例如我们使用Lenvenshtein算法计算CASTERS和POOH相似度时,结果是7,而使用JaroJaro-Winkler算法时,结果是0,因为两个字符串之间没有任何相似度。而Levenshtein算法总会得到一个距离,因为一个字符串经过编辑总是可以变成另一个字符串。

      • Pair Letters similarity: 只有“Fuzzy match”步骤里有这个算法,这个算法把两个字符串都分割成多个字符对,然后比较这些字符对。如CASTERS和CASTRO这个例子,这两个字符串被分割成{CA, AS, ST, TE, ER, RS}和{CS,AS,ST,TR,RO},最后的相似度=(相等的字符对个数)乘以2/两个字符串的字符对总个数,这个例子就是(3*2)/11=0.545(这个结果是匹配度非常高的)

      • Metaphone,Double Metaphone, Soundex和RefinedSoundEx:这些算法都是利用单词的发音来做匹配,也称为语音算法。这些语音算法的缺点是以英语为基础,所以基本不能用于法语,西班牙语,荷兰语等其他语种。

      当然,最后的问题就是我们应该选择哪个算法,这取决你要解决的问题。对信息提取类的需求,例如,提取亚马逊上所有的图书,找出和Pentaho相关的图书,并给出相似度分数,这时就可以使用字符对的模糊匹配算法。如果要做数据排重工作,而且还可能有拼写错误,这时就要使用Jaro-Winkler算法。但使用该算法时要小心匹配不准确的情况,如“Jos van Dongen”和“Davidson”这两个人名的相似度是0.615,而“Jos van Dongen”和“Dongen, jos van”这两个人名的相似度是0.604,从计算结果看前面一对人名相似度更高,但是我们可以看出后面的一对人名实际上是同一个人

      下面的转换来自于官方的例子: 
      (…\data-integration\samples\transformations\Fuzzy match.ktr)中

      这里写图片描述这里写图片描述
      最终结果: 
      这里写图片描述

      经过对比我们发现在模糊匹配的步骤中接受了两个字段流,Main RowRef Data ,那么究竟哪个是主字段流哪个是“字段库”流呢,我们看模糊匹配的“一般选项”中,有个“匹配流(源)”,这个就是我们所谓的“字段库”流(个人觉得这样理解起来比较容易),那么下面的“主要流字段”就是待匹配字段了。还有需要设置一下用来接收匹配结果的“字段”选项卡中:“匹配字段”和“值字段”,下面那条感觉可写可不写,想不到有什么特别需要的地方=。=,如果大家有的话请在下面评论提醒我,我们一起讨论。

      至此我们又搞定了一个步骤

      “Stream lookup(流查询)”步骤——使用参照表

      在很多场合下,如更正地址信息等,需要访问外部的主数据或参照数据(或字典表)。基础数据泪的应用一般都使用这些数据,如显示出标准的国家名和州名。但很多其他类的应用,数据并不规范。

      (前段日子的文章中提到我们公司要做数据迁移使用参照表时用的是Java脚本的hashmap来进行匹配,过程非常繁琐,但是用下面的步骤就可以很轻松的解决了。)

      经过对比发现书中样例和官方例子都各有不足,但是为了解读方便我们还是先来看下一书中的样例:

      此部分在书中的样例的路径文件为:

      …635179_downloads\635179_code_ch07\ch7files\LookupPostalCode.ktr

      这里写图片描述这里写图片描述

      解释一下,注意“流里的值查询” look up step 这里填写的就是字典步骤,“字段”就是源字段(源程序中的PC4应该改为pc4,实际上这本书中的错误很多很多),相当于字典中的key。“查询字段”就是字典字段,也相当于字典中的key,(当然这里容易让人产生误解,没有官方例子那么眼睛。)也就是说这两个步骤里的字段是通过这个选项来连接到一起的。 
      指定用来接收的字段就是我们要告诉程序 哪些字段是我们要提出来的 ,也就是说要明确指定出来字典中的value到底是哪个字段。


      然后我们看一下官方例子:

      …\data-integration\samples\transformations\Stream lookup - basics.ktr

      这里写图片描述这里写图片描述
      上图流里的值查询窗口最下方是定义了用来接收结果的字段名字,这个和上个转换不同的地方就在于它需要满足两个条件才会转。
    访问权限

    创建人 石明瑾
    文档编辑权限 创建者私有
    文档阅读权限 来自分类
    分类阅读权限 所有人
    分类编辑权限 所有人
    分类审核权限
    标签

    步骤 字符 字段 算法 就是 字符串 个字 我们 数据 使用
    历史版本

    修改日期 修改人 备注
    2017-07-20 08:29:46[当前版本] 石明瑾 CREAT
    同类知识
    相关知识

    睿恒知识库-V3.2.0