抽取:所有的数据抽取类的步骤都放在Input(输入)类别下,输入类的步骤,顾名思义就是从外部数据源抽取数据,把数据输入到Kettle的数据流中。一般来说准备要读取的数据(尤其是文件类数据)的功能,往往在作业里完成,实际读取数据才在转换着一层。
一、处理文本文件
总体来说文本文件分两类:
1、分隔符文件:这种文件里,每个字段或列都由特定字符或制表符分隔。通常这类文件也称CSV(逗号分割文件)文件或者制表分隔符文件。
2、固定宽度文件:每个字段列都有指定的宽度或者长度。
‘文本文件输入’步骤的其他主要功能如下:
1、从前一个步骤读取文件名。
2、一次运行读取多个文件名。
3、从.zip或.gzip压缩文件中读取文件。
4、不用指定文件结构就可以显示文件内容。
5、指定逃逸字符。
6、错误处理。
7、过滤。
8、指定本地化的日期格式。
CPU的处理能力的代价。
二、处理XML文件
XML文件时扩展标识语言的缩写,是一种平面文本文件中定义数据结构和内容的开放标准。XML文件不是普通的文本文件,而是一种遵照规范的结构化的文本文件。
Kettle里有四种验证XML数据是否有效的方法:
1、验证XML文件是否有效:基本的验证,只验证XML是否有完整的开始和结束标签,隔层嵌套的结构是否完整。
2、DTD验证:检查XML文件的结构是否符合(Data Type Defintion)文件的要求。DTD文件可以是一个独立的文件,也可以包含在XML文件中。
3、XSD验证(作业):检查XML文件的结构是否符合XML Schema定义文件的要求。
4、XSD验证(转换):和上面相同,但XML是在数据流的字段里(如数据库的列里包含XML格式数据)。
三、特殊文件类型
Access输入步骤:Access文件是一种轻量级的原型数据库或个人数据库,在被增加网络驱动功能后,它可以作为一些紧急任务的解决方法。Kettle里有‘Access输入’步骤,可以从Access文件里抽取数据,但Access不能被加密。
四、处理SAP数据
当需要抽取变换的、新增的或删除的数据,有以下三种方法:
1、发布文件:可以要求SAP开发人员一个程序、这个程序可以把变化的数据发布到一个文本文件中。大多数项目都是这样实现的,因为ETL不能直接访问SAP系统。
2、基于快照
3、给RFC增加参数:可以给RFC增加一个参数,来过滤出编号的数据,但这需要在SAP上来做修改。
数据剖析
数据剖析可以完成下面3个层次的工作:
1、列特征分析:搜集某一列数据的统计信息。
2、依赖性特征分析:分析表中不同列之间的依赖关系。
3、连接特征分析:分析不同表之间的依赖关系。
数据剖析工作的起点一般就是分析特征分析,它可以生成关于一列数据的统计数据,统计信息包括但不限于:
1、不同值的个数:这一列里有多少个值不相同的数据。
2、NULL值和空字符串的个数:这一列有多少个NULL值和空值。
3、最大最小值:这个统计不只用于数值类型的数据,也可以用于文本文件的数据。
4、数值类型的合计、中位数、平均数、标准差:各种关于数值类型的统计数据。
5、字符串模式和长度:可以用来验证数据格式是否正确
6、单词个数、大小写字符的个数:这一列里的单次的总个数,这些单次是全大写的还是全小写的,或者大小写混合的。
7、词频统计:一列里,词频最大、最小的N个单词。
CDC:变更数据捕获
ETL过程的第一步就是从不同的数据源抽取数据并把数据存储在数据缓存区。这个过程的主要挑战就是初始加载的数据量大和比较慢的网络延迟。在初始加载完成后,不能再把所有数据重新加载一遍。只需要抽取变化的数据。识别出变化的数据并只抽取这些变化的数据称为变化数据捕获。
CDC可以分为两种:一种是侵入性的,另一种是非侵入性的。所谓侵入性的是指CDC操作可能会给源系统带来性能的影响。只要CDC操作以任何一种方式执行了SQL语句,就可以认为是侵入性的CDC。以下四种CDC方法只有一种不是侵入性的:
1、基于源数据的CDC
CDC要求源数据里有相关的属性列,ETL过程可以利用这些属性列,来判断出那些数据是增量数据,常见的属性列有一下两种:
1)时间戳:这种方法至少需要一个更新时间戳,但最好有两个时间戳:一个是插入时间戳(记录什么时候创建)和一个更新时间戳(记录什么时间最后一次更新)。
2)序列:大多数数据库都有自增序列。如果数据库表用到里这种序列,就可以很容易识别出新插入的数据。
CDC最简单的实现方式,所以也是最常用的方法。缺点如下:
1)区分插入操作和更新操作:只能当源系统包含了插入时间戳和更新时间戳两个字段,才能区别插入和更新,否则不能区分。
2)删除急了的在操作:不能捕获到删除操作,除非是逻辑删除
3)多次更新监测:如果在一次同步周期内,数据被更新了多次,只能同步最后一次更新操作,中间的更新操作都丢失了。
4)实时能力:时间戳和基于序列的数据抽取一般适用于批量操作,不适合实时场景下的数据加载。
2基于触发器的CDC
当执行insert、update、delete这些SQL语句时,可以激活数据库里的触发器,并执行一些动作。就是说触发器可以用来捕获变更的数据并把数据保存到中间临时表里。然后这些变更的数据再从临时表里取出,被加载到数据仓库的数据缓存区里。但大多数场合下,不允许向数据库里添加触发器(需要变动数据库,服务协议里不允许或者管理员不允许),而且这种方法还会降低系统的性能,所以一般用的不多。
CDC功能。尽管这种方法看上去过程冗余、需要额外的存储空间,但实际非常有效,而且没有侵入性。
3、基于快照的CDC
如果没有时间戳、也不能用触发器,就要使用快照表了,通过比较来获得变化。快照表就是一次性抽取源系统中全部数据,把这些数据加载到数据仓库的缓冲区中。下一次需要同步时,再从源系统中抽取全部数据,并把全部数据也放到数据仓库的缓冲区中,作为这个表的第二版本,然后再比较这两个版本的数据,找到变化。
CDC可以检测到插入、更新和删除的数据,这是相对于基于时间戳的CDC方案的优点,但它的缺点是要大量的存储空间来保存这些快照。另外,在表比较大时,也会有比较严重的性能问题。
4、基于日志的CDC
最高级的和最没有侵入性的CDC方法是基于日志的方式。数据库会把每个插入、更新、删除操作记录到日志里。
CDC比较
时间戳 快照方式 触发器方式 日志方式
能区分插入/更新 否 是 是 是
周期内,检测到多次更新 否 否 是 是
能检测到删除 否 是 是 是
不具有侵入性 否 否 否 是
支持实时 否 否 是 是
需要DBA 否 否 是 是
不依赖数据库 是 是 否 否
数据发布
获得变更数据后,发布到数据库中的几种方法:
1、使用表输出步骤:这些数据可以被存储到一个独立的缓存数据表里。这样做的好处是可以使用标准的SQL操作来在后面的步骤里再进行处理,缺点是会带来额外的负载和冗余。使用数据库表并不是最快和最有效的方法。
2、文本文件输出:在一些场景下,需要先把变更后的数据输出到文本中,输出到文本文件中比输出到数据库要更快。这些文件汇总的数据随后在被导入到其他系统中。
3、XML输出:只有在接收数据的数据源只支持XML格式的数据时,才有必要用这种方式。因为生成XML格式的过程需要打的系统开销,所以尽量使用其他方式。
4、串行化到文件:这个步骤使用了特殊的文件格式,只能被‘De-serializafrom file’步骤读取。但使用这种私有的文件格式比文本文件性能更好,因为Kettle读取时不再解析文件格式。
5、复制记录到结果:这个步骤会把数据保存在内存里,在后面的转换里使用“Get rows from result”步骤可以获取这些数据。这也是转换之间交换数据的最快方式,但只限于内存。