数据分析基础篇16讲之12数据集成:这些大号一共20亿粉丝?

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

  • 数据集成:就是将多个数据源合并存放在一个数据存储中(如数据仓库),从而方便后续的数据挖掘工作。
  • 大数据项目中的数据集成包括有:数据清洗、数据抽取、数据集成和数据变换等操作。这是因为数据挖掘前我们的数据往往分布在不同的数据源中,需要考虑字段表达式是否一样,以及属性是否冗余。

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

  • 一般来说,数据工程师的工作包括了数据的ETL和数据挖掘算法的实现。
  • 什么是ETL呢?E是Extract(抽取)、T是Transform(转换)、L是Load(加载)三个过程。
    • 抽取是将数据从已有的数据源中提取出来。
    • 转换是对原始数据进行处理。
    • 加载是将经转换后的数据写到新的目的地。
  • 根据转换发生的顺序和位置,数据集成可以分为ETL和ELT两种架构。
    • ETL的过程为提取——转换——加载,在数据源抽取后首先进行转换,然后再将转换的结果写入目的地。
    • ELT的过程为提取——加载——转换,在抽取后将结果先写入目的地,然后再利用数据库的聚合分析能力或外部计算框架,来完成转换的步骤。
    • 目前主流架构是ETL,但未来使用ELT作为数据集成架构将越来越多。这样做为带来多种好处:
      • ETL和ELT相比,最大的区别是“重抽取和转换,轻转换”,从而可以使用更轻量的方案搭建一个数据集成平台。在提取完成好,数据加载会立即开始。一方面更省时,另一方面ELT允许BI分析人员无限制地访问整个原始数据,给分析师提供更大的灵活性,使之更好地支持业务。
      • 在ELT架构中,数据转换这个过程根据后续使用情况需要在SQL中进行,而不是在加载阶段进行。这样做的好处是你可以从数据源中提取数据,经过少量预处理后进行加载。这样的架构更将单,使分析人员更好地了解原始数据的转换过程。

ETL工具有哪些?

  • 商业软件有:Informatica PowerCenter、IBM InfoSphere DataStage、Oracle Data Integrator等。
  • 开源软件有:Kettle、DataX、Sqoop等。

Kettle工具的使用

  • Kettle是一款国外开源的ETL工具,纯Java编写,可在Windows或Linux系统上运行,不需要安装即可使用。
  • 使用Kettle之前需要安装数据库软件和Java运行环境即JRE
  • Kettle包括有两种脚本:分别是Transformation转换和Job作业。
    • Transformation(转换):类似于一个容器,用于对数据操作进行定义。这里的数据操作指的是数据从输入到输出的一个过程。通常工作中,我们把任务分解为不同的作业,然后再将作业分解为多个转换。
      • Transformation可以分为三个步骤:包括输入、转换和输出
      • Transformation包括两个主要概念:Step(步骤)和Hop(跳跃线)。
        • Step:是转换的最小单元,每一个Step完成一个特定的功能。
        • Hop:用来在转换中连接Step,代表了数据的流向。
    • Job(作业):是一个比转换更大的容器,它负责将转换组织起来完成某个作业。
      • Job包括两个概念:Job Entry(工作实体)、Hop(跳跃线)。
        • Job Entry:是Job内部的执行单元,每一个Job Entry都是用来执行具体的任务。
        • Hop:连接Job Entry的线,并且它可以指定是否有条件地执行。
  • 在Kettle中,你可使用Spoon,它是一种图形化的方式,可让你设计Job和Transformation,并且可以保存为文件或保存在数据库中。
  • 案例一:如何将文本文件内容转化到MySQL中
    • 在我跟着操作过程之前,总结了一些注意的要点:首先安装Kettle,以及安装JRE环境,推荐安装Java的JDK,因为安装好JDK后就含有了JRE环境,安装好Java后,配置环境变量,可自行网上查询,安装好数据库,我这里采用的是MySQL,在MySQL中创建一个“wucai”数据库,并创建一个“score”表,创建语句放入下方。
    • 第一步:打开Kettle后,点击左边框中的“转换——》右击新建”;
    • 第二步:在核心对象一栏搜索“文本文件输入”控件,或打开“输入”功能中找到“文本文件输入”,直接拖拽到右侧工作区;
    • 第三步:从左侧搜索“表输出”或“输出”功能栏中找到“表输出”,拖拽至工作区;
    • 第四步:鼠标在“文本文件输入”控件上停留,在弹窗中选择箭头向右图标,鼠标拖拽至“表输出”控件即可,将一条连线连接到两个控件上。或者选中“文本文件输入”控件,并按住shift键,鼠标拖拽到“表输出”控件即可;
    • 第五步:双击“文本文件输入”控件,从浏览中导入已经准备好的文本文件,并点击增加按钮,再确认即可,然后选择”内容“项,分隔符选用Insert Tab。选中“字段项”——》获取字段后,点击确定,再确定即可;
    • 第六步:双击“表输出”控件,从“数据库连接处点击右侧Wizard…”——》输入数据库连接名称“wucai”,选择数据库连接类型“MySQL”点击Next,输入服务器主机名称,由于这里使用的是本地,直接写“localhost”即可,输入数据库名称“wucai”,点击Next,输入MySQL用户名,密码,并测试数据库连接。(在测试数据库连接功能时可能会出现问题,我会把我遇到的问题记录下方以及解决方法)点击Finish,然后填写上目标表为score。
    • 第七步:创建数据库字段的对应关系,需要双击“表输出”,选择“数据库字段”项,将我们的表字段(我们文本文件中的字段)和流字段(输出到数据表中的字段)填好后确定。这里的字段包括有name、create_name、Chinese、English、Math。
    • 第八步:点击工作台左上角的执行图标即可。
    • 这样我们就完成了从文本文件到MySQL数据库的转换。我们可去数据库查询。
  • 阿里开源软件:DataX
    • 以往的数据库中,数据库都是两两之间的转换,没有统一标准。
    • 但DataX可以实现跨平台、跨数据库、不同数据库之间的数据同步和交互,它将自己作为标准,只需要不同的插件即可连接不同的数据源,并完成它们之间的转换。
    • 所以DataX的模式是框架+插件完成的。
    • 在这个框架中,Job作业被Splitter分割器分成了许多小的作业Sub-Job。在DataX中,通过两个线程缓冲池来完成读和写的操作。读和写都是通过Storage完成了数据的交换。比如在读模块。切分后的小作业将数据从源头转载到DataXStorsge,然后在写模块,数据从DataXStorage导入到目的地。
    • 这样带来的好处就是在整体框架下,我们可以对读和写进行插件的补充,如MySQL导入到Oracle中,就只需要扩充上MySQLReader和OracleWriter插件即可使用。
  • Apache开源软件Sqoop
    • Sqoop是一款由Apache基金会开发的分布式系统基础架构的开源工具。它主要是用来在Hadoop和关系型数据库中传递数据用的。通过Sqoop,我们可以很方便的将数据从关系型数据库中导入到HDFS上,或者从HDFS上导出到关系型数据库中。
    • Hadoop是一个分布式文件系统,即HDFS。Hadoop框架最核心的设计就是HDFS和MapReduce。HDFS提供了海量数据的存储功能,MapReduce则提供了海量数据的计算功能。
# 采用CMD方式登录   Windows + R
mysql -uroot -p 数据库密码

# 创建数据库 wucai
CREATE DATABASE wucai;

# 查询数据库
show databases;

# 切换/进入数据库 wucai
use wucai;

# 创建数据库表 score。包含 create_time、name、Chinese、English、Math 五个字段。
create table score (create_time varchar(255), name varchar(255), Chinese varchar(255), English varchar(255), Math varchar(255));

# 查询数据库表
show tables;

报错点以及解决方法:

1. 在Kettle导入文件字段时,报错“DOS format was specified but only a single line feed character was found, not 2”

# 解决方法:在文本文件输入框中————》内容————》格式换为“Unix”或“mixed”,不要使用DOS再试一下即可。


2. 在选用表输出模块时————》点击wizard后选好数据库mysql选好数据表————》写好数据库的用户名、用户密码————》测试连接时报以下错误
错误连接数据库 [wucai] : org.pentaho.di.core.exception.KettleDatabaseException: 
Error occurred while trying to connect to the database

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


org.pentaho.di.core.exception.KettleDatabaseException: 
Error occurred while trying to connect to the database

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


	at org.pentaho.di.core.database.Database.normalConnect(Database.java:477)
	at org.pentaho.di.core.database.Database.connect(Database.java:373)
	at org.pentaho.di.core.database.Database.connect(Database.java:344)
	at org.pentaho.di.core.database.Database.connect(Database.java:334)
	at org.pentaho.di.core.database.DatabaseFactory.getConnectionTestReport(DatabaseFactory.java:83)
	at org.pentaho.di.core.database.DatabaseFactory.getConnectionTestResults(DatabaseFactory.java:112)
	at org.pentaho.di.core.database.DatabaseMeta.testConnectionSuccess(DatabaseMeta.java:2843)
	at org.pentaho.di.ui.core.database.dialog.DatabaseDialog.test(DatabaseDialog.java:110)
	at org.pentaho.di.ui.core.database.wizard.CreateDatabaseWizardPage2.test(CreateDatabaseWizardPage2.java:157)
	at org.pentaho.di.ui.core.database.wizard.CreateDatabaseWizardPage2$3.widgetSelected(CreateDatabaseWizardPage2.java:147)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
	at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
	at org.eclipse.jface.window.Window.open(Window.java:796)
	at org.pentaho.di.ui.core.database.wizard.CreateDatabaseWizard.createAndRunDatabaseWizard(CreateDatabaseWizard.java:131)
	at org.pentaho.di.ui.trans.step.BaseStepDialog$4.widgetSelected(BaseStepDialog.java:738)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
	at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
	at org.pentaho.di.ui.trans.steps.tableoutput.TableOutputDialog.open(TableOutputDialog.java:888)
	at org.pentaho.di.ui.spoon.delegates.SpoonStepsDelegate.editStep(SpoonStepsDelegate.java:120)
	at org.pentaho.di.ui.spoon.Spoon.editStep(Spoon.java:8814)
	at org.pentaho.di.ui.spoon.trans.TransGraph.editStep(TransGraph.java:3287)
	at org.pentaho.di.ui.spoon.trans.TransGraph.mouseDoubleClick(TransGraph.java:785)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
	at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
	at org.pentaho.di.ui.spoon.Spoon.readAndDispatch(Spoon.java:1384)
	at org.pentaho.di.ui.spoon.Spoon.waitForDispose(Spoon.java:7949)
	at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9331)
	at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:710)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92)
Caused by: org.pentaho.di.core.exception.KettleDatabaseException: 
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

	at org.pentaho.di.core.database.Database.connectUsingClass(Database.java:520)
	at org.pentaho.di.core.database.Database.normalConnect(Database.java:461)
	... 45 more
Caused by: java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at org.pentaho.di.core.database.Database.connectUsingClass(Database.java:495)
	... 46 more

主机名       : localhost
端口           : 3306
数据库名:wucai

# 解决方法为:缺少mysql的驱动包,在https://dev.mysql.com/downloads/connector/j/链接下下载驱动包,解压后,将mysql-connector-java-5.1.48.jar包放到。。\Kettle\pdi-ce-8.3.0.0-371\data-integration\lib,即Kettle下的lib文件下,从新启动Kettle即可。

文本文件内容为:

create_time name Chinese English Math
2018/12/22 ZhangFei 66 65 30
2018/12/22 GuanYu 95 85 98
2018/12/22 ZhaoYun 93 92 96
2018/12/22 HuangZhong 90 88 77
2018/12/22 DianWei 80 90 90

它们之间的切割符为Tab键

你可能感兴趣的:(数据分析知识,数据分析实战45讲,极客时间)