CategoryResourceRepost/极客时间专栏/数据分析实战45讲/第一模块:数据分析基础篇/12 | 数据集成:这些大号一共20亿粉丝?.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

198 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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的工具选择和使用经历。
欢迎在评论区与我分享你的想法。如果你觉得这篇文章对你有帮助,欢迎点击“请朋友读”,分享给你的朋友和同事。