12 | 数据集成:这些大号一共20亿粉丝?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ELT 和 ETL 相比,最大的区别是“重抽取和加载,轻转换”,从而可以用更轻量的方案搭建起一个数据集成平台。使用 ELT 方法,在提取完成之后,数据加载会立即开始。一方面更省时,另一方面ELT允许 BI 分析人员无限制地访问整个原始数据,为分析师提供了更大的灵活性,使之能更好地支持业务。

  • 在ELT架构中,数据变换这个过程根据后续使用的情况,需要在 SQL 中进行,而不是在加载阶段进行。这样做的好处是你可以从数据源中提取数据,经过少量预处理后进行加载。这样的架构更简单,使分析人员更好地了解原始数据的变换过程。

ETL工具有哪些?

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

典型的ETL工具有:

  • 商业软件:Informatica PowerCenter、IBM InfoSphere DataStage、Oracle Data Integrator、Microsoft SQL Server Integration Services等

  • 开源软件:Kettle、Talend、Apatar、Scriptella、DataX、Sqoop等

相对于传统的商业软件,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

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

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

  • Transformation(转换):相当于一个容器,对数据操作进行了定义。数据操作就是数据从输入到输出的一个过程。你可以把转换理解成为是比作业粒度更小的容器。在通常的工作中,我们会把任务分解成为不同的作业,然后再把作业分解成多个转换。

  • Job(作业):相比于转换是个更大的容器,它负责将转换组织起来完成某项作业。

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

如何创建Transformation(转换)

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

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

  • Step(步骤):Step是转换的最小单元,每一个Step完成一个特定的功能。在上面这个转换中,就包括了表输入、值映射、去除重复记录、表输出这4个步骤;

  • Hop(跳跃线):用来在转换中连接Step。它代表了数据的流向。

如何创建Job(作业):

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

如何理解这两个概念呢?

  • Job Entry(工作实体):Job Entry是Job内部的执行单元,每一个Job Entry都是用来执行具体的任务,比如调用转换,发送邮件等。

  • Hop:指连接Job Entry的线。并且它可以指定是否有条件地执行。

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

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

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

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

Step1:创建转换,右键“转换→新建”;

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

Step3:从左侧选择“表输出”控件,拖拽到右侧工作区;

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

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

Step5:双击“文本文件输入”控件,导入已经准备好的文本文件;

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

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

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


Step8:点击左上角的执行图标,如下图:

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

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

另外给你推荐一个Kettle的开源社区:http://www.ukettle.org

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

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

阿里开源软件:DataX

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

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

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

在这个框架里,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等。

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

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

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

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

精选留言

  • Monica

    2019-01-09 12:13:17

    在“数据分析实战交流群”,老师分享了额外干货资料:“Kettle的操作视频”,有入群需求的,可加我的微信:imonica1010,和老师及同学们交流数据分析的学习心得。

    由于申请人数太多,进群免费但设置了一道小门槛,欢迎加我,了解入群规则。
  • 云深不知处

    2019-06-09 19:14:34

    大约三年大数据工程师工作,从最开始的数据集成(sqoop、代码、商用软件ETL工具等),将数据汇聚到数据仓库,理解业务,清洗应用需要的数据。数据集成是将多源(多系统)、多样(结构化、非结构化、半结构化)、多维度数据整合进数据仓库,形成数据海洋,更好的提供业务分析系统的数据服务,通过数仓的数据集成,达到数据共享的效果,降低对原始业务系统的影响,同时加快数据分析工作者的数据准备周期。数据集成最开始就是原始系统的数据,照样搬到数据仓库,这种类型工作长期实施,容易疲劳失去兴趣,理解业务需求,通过自己的数据集成、清洗、数据分析,提供有意思的数据,就是挖金子过程,应该也是一件有趣的事情。
    作者回复

    很好的分享,很多人都在做数据集成的工作,时间长了难免失去兴趣,相反数据分析会更有价值,能从数据中提炼金子

    2019-06-11 21:19:06

  • 2019-01-09 14:55:22

    实际操作完成,说下操作过程中注意事项:
    1、下载安装jdk1.8+,注意配置系统JAVA_HOME环境变量
    2、下载Kettle
    3、如果你用的是MySQL,导入数据时会报Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the 'MySQL' driver (jar file) is installed. org.gjt.mm.mysql.Driver错误。此时需要到https://dev.mysql.com/downloads/file/?id=468318%20下载后,解压出mysql-connector-java-5.1.41-bin.jar 包,放到pdi-ce-8.2.0.0-342\data-integration\lib目录即可。
  • 奔跑的徐胖子

    2019-03-22 06:32:33

    希望有如我一般的使用Mac的屌丝注意,安装完了Kettle之后,要去mysql官网下载驱动,这个驱动不能用最新版本的,要用老版本的才能连接数据库,我用的是5.1.46
    作者回复

    感谢分享

    2019-12-29 19:14:17

  • JingZ

    2019-01-09 18:13:15

    #2019/1/9 Kettle数据集成

    1、安装jdk:官网http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,下载mac版的JDK,下载后,直接安装。终端验证java-version~

    2、安装Kettle:https://sourceforge.net/projects/pentaho/files/Data%20Integration/
    下载最新pdi-ce-8.2.0.0-342.zip压缩包,直接生成data integration文件夹

    3、下载数据库驱动:https://dev.mysql.com/downloads/connector/j/
    mysql-connector-java-5.1.41.tar.gz解压,但是出现了query-cache-size问题,重新下载最新mysql-connector-java-8.0.13.tar.gz,又出现找不到jar文件。重启也不行~最后两个文件都放在了data integration/lib里面,貌似就可以了,这块还需再探索

    4、打开终端,启动Kettle:sh spoon.sh打开Spoon,开始文本输入和表输出了

    5、安装MySQL,同时安装了MySQL WorkBench建立数据库wucai和表score,目前出现表输出Unexpected batch update error committing the database connection和org.pentaho.di.core.exception.KettleDatabaseBatchException问题,可能是对SQL设置问题,还需debug

    接触新工具,还需多实践
    作者回复

    加油~ 不错的整理

    2019-12-29 21:21:23

  • 小熊猫

    2019-01-21 22:41:58

    老师前面讲了ELT比ETL更方便,结果后面介绍的是ETL。。。
  • 丛培欣

    2020-02-19 23:15:31

    做了三四年的大数据工程师,数据清洗工作是长期存在的,做了这么多的ETL的工作,看了这个课程后,才知道,针对大数据工程师而言,几乎所有场景下做的数据清洗都是ELT,基本流程都是抽取原始数据,加载到更强大的分布式计算框架中,eg: Spark 来进行数据的转换,最终输出结果数据。
  • GGYY

    2019-01-29 20:38:44

    “we were unable to find any new incoming fields”

    这里试试在“内容”一栏,吧编码方式改一下。默认为 DOS
  • veical

    2019-01-10 08:23:11

    加载就是把转换后的数据从中间层(stage层,通常是一个数据库或数据库集群)导入数据分析层,然后才能在模型中用这些干净的数据进行数据分析
    作者回复

    对的

    2019-12-29 21:20:41

  • lingmacker

    2019-01-18 19:48:04

    为什么我获取字段会出现 we were unable to find any new incoming fields! 错误啊?
  • Yafei

    2019-03-13 04:17:32

    Deepin linux
    1. 安装 openjdk
    2. 0. 下载kettle zip包,解压即可。
    2. 下载 mysql jdbc driver(https://dev.mysql.com/downloads/connector/j/),解压將 mysql-connector-java-8.0.15 (我用的这个版本) 放入 ‘data-integration/lib/’ 目录下。
    3. sudo apt-get install mysql ,安装完后如果使用 root 用户,注意是否能以localhost登录,创建一个数据库用来测试,并创建一个table,表名随意,字段能对应到你的数据即可。
    4. 运行脚本 spoon.sh 打开 kettle, 添加 text input ,双击 -- 添加数据文件 -- 切换到‘内容’ -- 修改分隔符为tab -- 修改格式为 Unix(如不修改会找不到字段) -- 切换到‘字段’ --获取字段
  • 夏天

    2019-01-28 21:18:00

    使用postgresql的朋友, 记得再spoon中给表字段加引号
  • qinggeouye

    2019-11-12 01:11:00

    1、搭环境(open jdk , mysql 8.0 , mysql-connector for java, kettle)
    2、启动 kettle , 实操 ...
    作者回复

    嗯 加油~

    2019-12-23 14:31:56

  • Lin_嘉杰

    2019-01-09 03:07:44

    对数据集成的理解仅限于对多个来源的数据源,比如csv,mysql,nosql,excel等,尽可能完整集合成一个全面的数据库,方便后续数据挖掘。
  • 叫我源仔

    2022-05-06 11:08:01

    老是http://t.cn/E4SzvOf打不开了。求数据
  • 羊小看

    2019-08-27 13:24:57

    目前我们做的业务需求比较多,一个需求有时会关联五六张表,所以我们特别希望可以先做转换,做成大宽表,入仓,可以直接用。
    老师说的先加载再转换,是适用于做数据挖掘时吗?
    作者回复

    两种方式都适用于数据挖掘的情况

    2019-12-29 14:41:46

  • Chino

    2019-01-21 15:24:57

    文本文件输入那里获取字段出错误了 出错原因拿去搜了下 还什么都搜不出来 求教啊
    we were unable to find any new incoming fields
  • 杨名流

    2019-01-20 19:18:54

    按照视频操作,获取不到文本文件字段,怎么解决?
  • yanyu-xin

    2024-03-17 13:50:44

    实际完整下载安装搭环境,运行一次。
    1、open jdk,安装完要设置环境,测试成功才能进行下一步
    2 、 mysql 8.0,安装完成,设置好测试的数据库,配备MYSQL组件。
    3 、 mysql-connector for java,网站的下载链接在PDF文件中,很隐蔽的。将解压的jar包放入kettle安装目录下的data integration/lib
    4、kettle,不需要安装,运行批处理文件spoon.bat。启动时间较长。进行MySQL数据连接参数配备,测试是否成功
    5、启动kettle ,构建数据流图,,配置数据流图中的各个组件,设置内容分隔符、字段等。保存并启动执行。
  • Sandy

    2019-04-08 12:19:41

    我现在每天的工作就是写kettle job
    作者回复

    不错的分享,看来ETL工作需求还是挺大的

    2019-12-29 18:42:34