<audio id="audio" title="12 | 数据集成：这些大号一共20亿粉丝？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/28/14/28d44de979dfee9e9b300e580e1c5714.mp3"></audio>

我们采集的数据经常会有冗余重复的情况。举个简单的例子，假设你是一个网络综艺节目的制片人，一共有12期节目，你一共打算邀请30位明星作为节目的嘉宾。你知道这些明星影响力都很大，具体在微博上的粉丝数都有标记。于是你想统计下，这些明星一共能直接影响到微博上的多少粉丝，能产生多大的影响力。

然后你突然发现，这些明星的粉丝数总和超过了20亿。那么他们一共会影响到中国20亿人口么？显然不是的，我们都知道中国人口一共是14亿，这30位明星的影响力总和不会覆盖中国所有人口。

那么如何统计这30位明星真实的影响力总和呢？这里就需要用到数据集成的概念了。

数据集成就是将多个数据源合并存放在一个数据存储中（如数据仓库），从而方便后续的数据挖掘工作。

据统计，大数据项目中80%的工作都和数据集成有关，这里的数据集成有更广泛的意义，包括了数据清洗、数据抽取、数据集成和数据变换等操作。这是因为数据挖掘前，我们需要的数据往往分布在不同的数据源中，需要考虑字段表达是否一样，以及属性是否冗余。

## 数据集成的两种架构：ELT和ETL

数据集成是数据工程师要做的工作之一。一般来说，数据工程师的工作包括了数据的ETL和数据挖掘算法的实现。算法实现可以理解，就是通过数据挖掘算法，从数据仓库中找到“金子“。

什么是ETL呢？ETL是英文Extract、Transform和Load的缩写，顾名思义它包括了数据抽取、转换、加载三个过程。ETL可以说是进行数据挖掘这项工作前的“备菜”过程。

我来解释一下数据抽取、转换、加载这三个过程。

抽取是将数据从已有的数据源中提取出来。

转换是对原始数据进行处理，例如将表输入1和 表输入2 进行连接形成一张新的表。

<img src="https://static001.geekbang.org/resource/image/31/68/31a88246298e317c90412bc9c03eee68.png" alt="">

如果是三张表连接的话，可以怎么操作呢？先将表输入1和表输入2进行连接形成表输入1-2，然后将表输入1-2和表输入3进行连接形成新的表。然后再将生成的新表写入目的地。

<img src="https://static001.geekbang.org/resource/image/bd/f7/bd39e4f480f92a1794ccc43f51acf9f7.png" alt="">

根据转换发生的顺序和位置，数据集成可以分为 ETL 和 ELT 两种架构。

ETL 的过程为提取(Extract)——转换(Transform)——加载(Load)，在数据源抽取后首先进行转换，然后将转换的结果写入目的地。

ELT 的过程则是提取(Extract)——加载(Load)——变换(Transform)，在抽取后将结果先写入目的地，然后利用数据库的聚合分析能力或者外部计算框架，如Spark来完成转换的步骤。

<img src="https://static001.geekbang.org/resource/image/90/c2/90df6593871fa5974e744907bb145bc2.jpg" alt="">

目前数据集成的主流架构是ETL，但未来使用ELT作为数据集成架构的将越来越多。这样做会带来多种好处：

<li>
ELT 和 ETL 相比，最大的区别是“重抽取和加载，轻转换”，从而可以用更轻量的方案搭建起一个数据集成平台。使用 ELT 方法，在提取完成之后，数据加载会立即开始。一方面更省时，另一方面ELT允许 BI 分析人员无限制地访问整个原始数据，为分析师提供了更大的灵活性，使之能更好地支持业务。
</li>
<li>
在ELT架构中，数据变换这个过程根据后续使用的情况，需要在 SQL 中进行，而不是在加载阶段进行。这样做的好处是你可以从数据源中提取数据，经过少量预处理后进行加载。这样的架构更简单，使分析人员更好地了解原始数据的变换过程。
</li>

**ETL工具有哪些？**

介绍完了这两种架构，你肯定想要知道ETL工具都有哪些？

典型的ETL工具有:

<li>
商业软件：Informatica PowerCenter、IBM InfoSphere DataStage、Oracle Data Integrator、Microsoft SQL Server Integration Services等
</li>
<li>
开源软件：Kettle、Talend、Apatar、Scriptella、DataX、Sqoop等
</li>

相对于传统的商业软件，Kettle是一个易于使用的，低成本的解决方案。国内很多公司都在使用Kettle用来做数据集成。所以我重点给你讲解下Kettle工具的使用。

## Kettle工具的使用

Kettle是一款国外开源的ETL工具，纯Java编写，可以在Window和Linux上运行，不需要安装就可以使用。Kettle 中文名称叫水壶，该项目的目标是将各种数据放到一个壶里，然后以一种指定的格式流出。

Kettle在2006年并入了开源的商业智能公司Pentaho, 正式命名为Pentaho Data Integeration，简称“PDI”。因此Kettle现在是Pentaho的一个组件，下载地址：[https://community.hitachivantara.com/docs/DOC-1009855](https://community.hitachivantara.com/docs/DOC-1009855)

在使用Kettle之前还需要安装数据库软件和Java运行环境（JRE）。

Kettle采用可视化的方式进行操作，来对数据库间的数据进行迁移。它包括了两种脚本：Transformation转换和Job作业。

<li>
Transformation（转换）：相当于一个容器，对数据操作进行了定义。数据操作就是数据从输入到输出的一个过程。你可以把转换理解成为是比作业粒度更小的容器。在通常的工作中，我们会把任务分解成为不同的作业，然后再把作业分解成多个转换。
</li>
<li>
Job（作业）：相比于转换是个更大的容器，它负责将转换组织起来完成某项作业。
</li>

接下来，我分别讲下这两个脚本的创建过程。

**如何创建Transformation（转换）**

Transformation可以分成三个步骤，它包括了输入、中间转换以及输出。

<img src="https://static001.geekbang.org/resource/image/de/ea/de0b5c9d489a591fa1f478cfd09585ea.png" alt="">

在Transformation中包括两个主要概念：Step和Hop。Step的意思就是步骤，Hop就是跳跃线的意思。

<li>
Step（步骤）：Step是转换的最小单元，每一个Step完成一个特定的功能。在上面这个转换中，就包括了表输入、值映射、去除重复记录、表输出这4个步骤；
</li>
<li>
Hop（跳跃线）：用来在转换中连接Step。它代表了数据的流向。
</li>

<img src="https://static001.geekbang.org/resource/image/ba/f7/bab04c4d05f3a5dbd02d8abd147630f7.jpg" alt="">

**如何创建Job（作业）：**

完整的任务，实际上是将创建好的转换和作业串联起来。在这里Job包括两个概念：Job Entry、Hop。

如何理解这两个概念呢？

<li>
Job Entry（工作实体）：Job Entry是Job内部的执行单元，每一个Job Entry都是用来执行具体的任务，比如调用转换，发送邮件等。
</li>
<li>
Hop：指连接Job Entry的线。并且它可以指定是否有条件地执行。
</li>

在Kettle中，你可以使用Spoon，它是一种一种图形化的方式，来让你设计Job和Transformation，并且可以保存为文件或者保存在数据库中。下面我来带你做一个简单的例子。

**案例1：如何将文本文件的内容转化到MySQL数据库中**

这里我给你准备了文本文件，这个文件我上传到了GitHub上，你可以自行下载：[http://t.cn/E4SzvOf](http://t.cn/E4SzvOf)，数据描述如下：

<img src="https://static001.geekbang.org/resource/image/3b/97/3b6ad903051b066bfba1a4cf3a0d3197.png" alt="">

下面我来教你，如何将文本文件的内容转化到MySQL数据库中。

Step1：创建转换，右键“转换→新建”；

Step2：在左侧“核心对象”栏目中选择“文本文件输入”控件，拖拽到右侧的工作区中；

Step3：从左侧选择“表输出”控件，拖拽到右侧工作区；

Step4：鼠标在“文本文件输入”控件上停留，在弹窗中选择图标，鼠标拖拽到“表输出”控件，将一条连线连接到两个控件上；

这时我们已经将转换的流程设计好了，现在是要对输入和输出两个控件进行设置。

Step5：双击“文本文件输入”控件，导入已经准备好的文本文件；

Step6：双击“表输出”控件，这里你需要配置下MySQL数据库的连接，同时数据库中需要有一个数据表，字段的设置与文本文件的字段设置一致（这里我设置了一个wucai数据库，以及score数据表。字段包括了name、create_time、Chinese、English、Math，与文本文件的字段一致）。

具体操作可以看下面的演示：

<img src="https://static001.geekbang.org/resource/image/6f/c9/6fb632fe0f3a2cce4169b9633a86c0c9.gif" alt="">

Step7：创建数据库字段的对应关系，这个需要双击“表输出”，找到数据库字段，进行字段映射的编辑；

<img src="https://static001.geekbang.org/resource/image/8f/04/8fee5a90cab86200102a7006efe88104.png" alt=""><br>
Step8：点击左上角的执行图标，如下图：

<img src="https://static001.geekbang.org/resource/image/f9/6d/f9678df2fa2d1684a03d43f90cce716d.png" alt="">

这样我们就完成了从文本文件到MySQL数据库的转换。

Kettle的控件比较多，内容无法在一节课内容中完整呈现，我只给你做个入门了解。

另外给你推荐一个Kettle的开源社区：[http://www.ukettle.org](http://www.ukettle.org) 。

在社区里，你可以和大家进行交流。因为Kettle相比其他工具上手简单，而且是开源工具，有问题可以在社群里咨询。因此我推荐你使用Kettle作为你的第一个ETL工具。

当然除了Kettle工具，实际工作中，你可能也会接触到其他的ETL工具，这里我给你简单介绍下阿里巴巴的开源工具DataX和Apache的Sqoop。

**阿里开源软件：DataX**

在以往的数据库中，数据库都是两两之间进行的转换，没有统一的标准，转换形式是这样的：

<img src="https://static001.geekbang.org/resource/image/cf/50/cf2a017d2055afb1f8236bd6518e1c50.jpg" alt="">

但DataX 可以实现跨平台、跨数据库、不同系统之间的数据同步及交互，它将自己作为标准，连接了不同的数据源，以完成它们之间的转换。

<img src="https://static001.geekbang.org/resource/image/ad/ac/ad35fb37962b548f6bf7a00b291ec9ac.jpg" alt="">

DataX的模式是基于框架+插件完成的，DataX的框架如下图：

<img src="https://static001.geekbang.org/resource/image/8c/67/8cac4b4298187dcd4621c9a1f9551a67.jpg" alt="">

在这个框架里，Job作业被Splitter分割器分成了许多小作业Sub-Job。在DataX里，通过两个线程缓冲池来完成读和写的操作，读和写都是通过Storage完成数据的交换。比如在“读”模块，切分后的小作业，将数据从源头装载到DataXStorage，然后在“写”模块，数据从DataXStorage导入到目的地。

这样的好处就是，在整体的框架下，我们可以对Reader和Writer进行插件扩充，比如我想从MySQL导入到Oracle，就可以使用MySQLReader和OracleWriter插件，装在框架上使用即可。

**Apache开源软件:Sqoop**

Sqoop是一款开源的工具，是由Apache基金会所开发的分布式系统基础架构。Sqoop在Hadoop生态系统中是占据一席之地的，它主要用来在Hadoop和关系型数据库中传递数据。通过Sqoop，我们可以方便地将数据从关系型数据库导入到HDFS中，或者将数据从HDFS导出到关系型数据库中。

Hadoop实现了一个分布式文件系统，即HDFS。Hadoop的框架最核心的设计就是HDFS和MapReduce。HDFS为海量的数据提供了存储，而MapReduce则为海量的数据提供了计算。

## 总结

今天我介绍了数据集成的两种架构方式，以及Kettle工具的基本操作。不要小看了ETL，虽然它不直接交付数据挖掘的结果，但是却是数据挖掘前重要的工作，它包括了抽取各种数据、完成转化和加载这三个步骤。

因此除了数据科学家外，还有个工作职位叫ETL工程师，这份工作正是我们今天介绍的从事ETL这种架构工作的人。如果你以后有机会从事这份工作，你不仅要对今天介绍的数据集成概念有所了解，还要掌握至少一种ETL开发工具，如Kettle、DataX、 Sqoop等；此外还需要熟悉主流数据库技术，比如SQL Server、PostgeSQL、Oracle等。

<img src="https://static001.geekbang.org/resource/image/07/a0/0767b2fa01ea526d19857e9b95bc1ba0.jpg" alt="">

这是我操作kettle的流程视频，你可以看一下。

<video poster="https://media001.geekbang.org/fbf6c6f0ef2f42c5bf9f198130b9c277/snapshots/5acd5761081a42a7be87ad1a8928ed54-00005.jpg" preload="none" controls=""><source src="https://media001.geekbang.org/customerTrans/6f475a24b1498919eb0a38bef256c23a/15b8fc74-16830ca5b16-0000-0000-01d-dbacd.mp4" type="video/mp4"><source src="https://media001.geekbang.org/fbf6c6f0ef2f42c5bf9f198130b9c277/6f95e4f2689b45f4b4878296ce87a0b3-5d490a3237a5a3067be4a6521f2da2b9-sd.m3u8" type="application/x-mpegURL"><source src="https://media001.geekbang.org/fbf6c6f0ef2f42c5bf9f198130b9c277/6f95e4f2689b45f4b4878296ce87a0b3-88d3b20c5e3c1533960f8165340c3aad-hd.m3u8" type="application/x-mpegURL"></video>

今天我给你讲了数据集成的两种架构，以及帮助我们实现ETL的工具Kettle。纸上得来终觉浅，绝知此事要躬行。你不妨尝试下如何使用Kettle将MySQL数据库内容转化到文本文件？

另我想让你来谈谈，你对数据集成的理解，如果你之前做过ETL的工具，也请你来谈一谈你对ETL的工具选择和使用经历。

欢迎在评论区与我分享你的想法。如果你觉得这篇文章对你有帮助，欢迎点击“请朋友读”，分享给你的朋友和同事。
