使用 Hive 作为 ETL 或 ELT 工具

用来处理数据的 ETL 和 ELT 工具的概述

数据集成和数据管理技术已存在很长一段时间。提取、转换和加载(ETL)数据的工具已经改变了传统的数据库和数据仓库。现在,内存中转换 ETL 工具使得提取、加载、转换(ELT)和 ETL 变得更快。对于大数据来说,是否能够使用内置的 Hadoop 工具而不是使用传统的 ETL 工具来提取、加载和转换数据呢?

大多数 ETL 软件包需要自己的服务器、处理、数据库和许可,还需要专家在该特定的工具中安装、配置和开发它们,而且这些技能并非总是可以转移的。Microsoft® SQL Server® Integration Services 或 IBM InfoSphere® DataStage® 的专家可能不知道如何使用 Informatica 或 Pentaho。为了避免采用新工具所涉及的学习曲线,可以考虑改为使用 Hadoop 生态系统中的工具。Apache Hive 和 Apache Pig(包括在 Hadoop 生态系统中)是提取、加载和转换各种形式的数据的领导者。与许多擅长结构化数据的传统 ETL 工具不同,创建 Hive 和 Pig 是为了在 Hadoop 分布式文件系统(HDFS)中加载和转换非结构化、结构化或半结构化数据。

Hive 构建??于传统的数据库和数据仓库理念之上。它对待数据的方式就像是它有一个基于 SQL 或基于架构的结构。在 Hive 中,您可以将数据加载到 HDFS 中,或者将数据直接加载到 Hive 表中。不过,Pig 更加类似于标准的 ETL 脚本语言。在 Pig 中,您的心里可能有一个模式,但您更关心的是如何利用更复杂的功能在 HDFS 中转换和集成数据,而不是简单地将它们放进一个特定的表或数据库。因为 Pig 和 Hive 都使用了 MapReduce 功能,所以它们在执行非面向批量的处理时可能并不是那么快。有些开源工具试图改变这种限制,但问题依然存在。

回页首

传统的 ETL 和 ELT 理念的优点和局限性

选择 ETL 还是 ELT

传统的 ETL 在整个行业中已为人熟知。您可以从数据源 A、B 和 C 中提取数据。您创建并开发不同的方式,通过一定的工作流和数据集成流程来集成、反规范化(de-normalize)并转换那些数据。最后,将集成的数据加载到数据仓库或数据库中,并尝试自动化该流程。

相反,因为 Hadoop 技术的引入,而且硬件和存储已变得便宜得多,另一个理念(ELT)已日渐普及。仍然从数据源 A、B 和 C 提取数据,但先不转换它们,而是将原始数据加载到数据库或 HDFS。通常,加载流程不需要使用模式,而且该数据可以在存储库中保持未处理状态(实际上是被归档)很长一段时间。在需要数据时,某人可以构建一个模式,转换数据,并确定如何分析该数据。这个人甚至可以将新的、转换后的数据加载到另一个平台,如 Apache HBase。

采用 ELT 的好处是,原始数据可以在存储中保留很长时间,其他人可以通过自己希望的方式使用相同的数据,而不是采用某人在五年前决定的反规范化方式和建造该系统的方式。

多年来,ETL 技术和工具几乎完全没有变化,尤其在数据仓库方面。工具已经有所改进,但方法大体保持不变。您从各种来源提取数据,运行一组脚本或 ETL 工作流来转换该数据,然后将其加载到一个星型模式或半标准化的数据仓库或主数据管理系统中。

大部分数据专业人士都很熟悉 ETL。变更管理、慢慢改变的维度、插入、更新和发行公告等问题都已在多年前得到解决或找到解决方法。由于数据仓库中的数据并不总是可靠的,人们依靠微软 Excel® 电子表格来存储数据。这种方法已经形成了其理念和方法论,而且已经实现了相应的战略,但仍有许多不同的方法。

ETL 理念的关键限制是,在流程的早期,必须有人来确定哪些数据是重要的,哪些数据需要更新,哪些数据需要放在一边,以及谁可以获得数据许可。数据仓库或主数据管理系统只存储有人认为重要的数据。最初的原始数据不会被存储,并且无法进行检索。数据集市和转换后的数据成为仅有的可用数据,即使它是数据子集,创建和设计它的人有可能甚至已没有在该公司工作,可能对哪些数据重要持有不同的理念。

鉴于这些限制,人们开始寻找解决方法,比如在本地数据库中存储数据。部门建立了自己的孤岛和数据集市,突然之间,主数据成为了一种有趣的概念,而不是现实。数据并不是集成的数据。销售、营销和财务团队都有不同的数据。数字和仪表板是不可靠的,不值得信任。显然,ETL 不能容纳大数据。

回页首

使用 Hive 作为传统 ELT 工具的替代

Apache Hive 数据仓库软件有助于查询和管理位于分布式存储中的大型数据集。对于 ETL 而言,Hive 是一个强大的工具,而对于 Hadoop,它既是数据仓库,也是 Hadoop 的数据库。不过,相对于传统的数据库,它是相对缓慢的。它没有提供所有的 SQL 特性,甚至没有提供与传统的数据库相同的数据库特性。但它支持 SQL,它的确像一个数据库那样工作,它让更多的人(即使那些不是程序员的人)可以获得 Hadoop 技术。它提供了一种将非结构化和半结构化数据转化为基于模式的可用数据的方法。要建立一个主数据管理系统?您可以利用 Hive。要建立一个数据仓库?您也可以利用 Hive,但您需要学习一些技巧,使 Hive 成为一个强大的 ETL 工具。

相对于 Apache Pig 和 MapReduce,Hive 让传统的 RDBMS 数据库开发人员或了解 SQL 的其他人可以更容易访问和转换 Hadoop 中的数据。然而,Pig 不太容易理解,对于那些没有软件开发背景的人来说道,学习曲线是陡峭的。MapReduce 是 Java™、C ++ 和 Python 程序员可以相对迅速学会的技术。但是,如果没有一项技术(如 Java)基础,几乎不可能学会 MapReduce。因此,如果您知道 SQL,那么学习和使用 Hive 就会比较容易。

回页首

例如:如何使用 Hive 实现 ELT

我从世界银行的网站提取逗号分隔值(CSV)文件。该网站有大量关于经济、金融、贫困等方面的样本和真实数据。在这个示例中,我下载了 World-Finance, Inequality, and Poverty 1958-1998。这些数据将用于研究和教育目的,它们是 52 个发展中国家和发达国家的样本汇总。这些数据包括私人信贷、通货膨胀、国内生产总值(GDP)、GDP 增长率、收入占比等指标,它们提供了可能的洞察力。

在这个示例中,我使用 Hive 从网站提取数据,加载它,并转换它。此用例的目标是要取消各种来源的标准(本例中有 4 个 CSV 文件),然后对一个列执行一些简单的汇总。在您阅读这篇文章,并逐步完成这个示例之后,就会知道如何使用 Hive 实现 ELT 功能。要学习如何执行传统的 ETL 功能,只需逆转该流程,先使用 Hive 转换和汇总数据,然后加载它。

InfoSphere BigInsights Quick Start Edition

InfoSphere BigInsights Quick Start Edition 是一个免费的、可下载的 InfoSphere BigInsights 版本,是 IBM 基于 Hadoop 的产品。使用 Quick Start Edition,您可以试用核心 Hadoop 的一些特性(HDFS、MapReduce)和生态系统中的其他服务,比如 Pig、Hive 和 Apache ZooKeeper。

引导式学习可让您的体验尽可能地顺畅,包括按部就班、自订进度的教程和视频,可帮助您开始让 Hadoop 为您所用。没有时间或数据限制,您可以自行安排时间,在大量数据上试验。观看视频学习教程(PDF),并 立刻下载 BigInsights Quick Start Edition

为了执行这些步骤,您需要获得 IBM InfoSphere® BigInsights™ Quick Start Edition。(您需要拥有或注册一个 IBM 通用 ID,然后才能下载 InfoSphere BigInsights Quick Start Edition。??)

有两个版本可供下载。首先是 Quick Start Native Software Edition;用它在您自己的机器上运行软件。另一个版本是 Quick Start Edition VMware Image(为 Mac 用户融合);您需要有 VMware Player,这个虚拟镜像才可以工作。我使用的是在 CentOS 6.4 Linux® 桌面上的 VMware Player 版本。

导入数据

首先从世界银行网站下载包含 4 个 CSV 文件的 .zip 文件。参见 下载 部分的文件。

然后,启动 InfoSphere BigInsights。(在 VMware Player 版本中,只需单击图标启动 InfoSphere BigInsights,就会立刻启动并运行 Hadoop。)单击 InfoSphere BigInsights 中的 shell 文件夹,单击终端,就可以开始为这个用例建立您的目录。清单 1 显示了命令行。

清单 1. 为用例创建文件夹结构
$ Sudo mkdir WorldBank
$ cd WorldBank
$ Sudo mkdir data
$ cd data
$ wget
http://microdata.worldbank.org/index.php/catalog/1788/download/28424/
WLD_1998_FIP_v01_M_CSV.zip
$ ls
$ cd WLD_1998_FIP_v01_M
$ ls
$ unzip WLD_1998_FIP_v01_M_CSV.zip
$ ls

如果操作正确,您应该获得四个 CSV 文件。现在,将数据加载到 Hadoop 中。在 InfoSphere BigInsights 中,您可以有几种加载方法。Distributed File Copy 应用程序使加载变得更容易,但在这个示例中,请使用以下 Hadoop shell 命令:

$ hadoop fs -ls
$ hadoop fs -mkdir WorldBank

现在您已经在 HDFS 中创建了 World Bank 目录,您可以使用下面的代码将 CSV 文件添加到 Hadoop:

$ hadoop fs -copyFromLocal
/home/biadmin/WorldBank/data/WLD_1998_FIP-v01_M/*.csv /user/biadmin/WorldBank
$ hadoop fs -ls /user/biadmin/WorldBank

四个 CSV 文件现在都已在 HDFS 中。下一步是用 Hive 转换那些文件。

设计 Hive 模式和数据库

首先,您需要了解数据在这些 CSV 文件中是如何布局的。在 Linux 终端窗口中输入以下命令:

$ head -2 Finance_inequality_and_the_poor_data_6005.csv

head -2 命令让您可以看到 CSV 文件的前两行(文件头加上第一行)。您可以看到 17 个列,其中大部分是数字或十进制格式,这使得它更容易。惟一的例外是 Countrycode,这是一个类似于字符串的字符。接着,查看其他文件。在 Linux 中,可以用不同的方式来比较文件(diff等),但现在,只需使用下面的命令来查看列名和数据:

$ head -2 Finance_inequality_and_the_poor_data_8005.csv

第二个文件有更多的列。除了 countrycode 之外,还有 Country 和年份列。只可以看见 13 列。当您比较这个文件与 * .6005.csv 文件时,似乎缺失了其他一些列。当您继续完成这个过程时,就会看到这四个 CSV 文件有差异,这使得反规范化和汇总数据变得更具挑战性。

确定如何建模您的数据库。您可以看到,您将获得四个核心表(60058005data_panel 和 data_poverty)。创建并加载这些表后,需要创建一个反规范化的主表。在这个示例中,称这个表为 Finance_Inequality。此表整合了来自四个表中的所有数据。(显然,某些列将会留空。)

在创建和加载主表 (Finance_Inequality) 之后,最后一步是汇总一个列,并建立一个 Finance_Inequality_Transformed 表。这是一个简单的用例,但正如您所看到的,不难想象 Hive 用来构建复杂的汇总表和转换表的生产级系统是怎样的。

看看您必须为您的表创建的 6005 列:

  • countrycode
  • year
  • loginitialgini
  • growtheingini
  • span
  • loginitialgdppercapita
  • growthgdppercapital
  • privcreavg
  • logprivatecredit
  • inflation
  • logtrade
  • gr_ltrade
  • gr_school
  • logschooling
  • logcommercialcentralbank
  • loginitiallowestincomshare
  • growthinlowestincomeshare

这个列表让您很容易了解需要做什么和创建什么。除了 countrycode 之外,6005 表将有 17 个数字或十进制的列。接下来,我们要开始建立数据库。

单击 InfoSphere BigInsights shell,然后单击 Hive Shell

我通常会为每个表都创建文本文件,在该文件中编写 SQL 和 Data Manipulation Language (DML) 代码,保存表,然后将代码粘贴到 Hive shell 中。这种方法比在命令 shell 中逐行键入 SQL 和 DML 代码要容易得多。

清单 2 提供了创建数据库和第一个 6005 表的 SQL 代码。

备注:在我使用的 InfoSphere BigInsights 版本中,DECIMAL 无法工作,所以我必须使用 Double

清单 2. 创建数据库和 6005 表的 SQL 代码
show databases;
create database WorldBank_Finance_Inequality;
use WorldBank_Finance_Inequality;
Create table IF NOT EXISTS WorldBank_Finance_Inequality.tbl_6005
(
 countrycode String,
 year int,
 loginitialgini double,
 growtheingini double,
 span int,
 loginitialgdppercapital double,
 growthgdppercapital double,
 privcreavg double,
 logprivatecredit double,
 inflation double,
 logtrade double,
 gr_ltrade double,
 gr_school double,
 logschooling double,
 logcommercialcentralbank double,
 loginitiallowestincomshare double,
 growthinlowestincomeshare double
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,‘
;

现在,用类似的方式创建表 tbl_8005tbl_data_panel 和 tbl_data_poverty

在创建了四个表后,就已经做好了使用以下命令来填充它们的准备:

LOAD DATA INPATH ‘/user/biadmin/WorldBank/Finance_inequality_and_the_poor_data_6005.csv‘
OVERWRITE INTO TABLE worldbank.finance_inequality.tbl_6005;
select * from worldbank.finance_inequality.tbl_6005 limit 10;
select count(*) from worldbank.finance_inequality.tbl_6005;

填充表并运行一些简单的 select 语句后,数据应该是正确的。您可以先删除头文件,再将它们加载到 HDFS 或 Hive 表中。

备注:请记住,在您创建表时,要包括用单引号 () 终止的行格式分隔字段。如果遗漏了这个关键部分,将无法正确加载您的数据。

构建主 Finance_Inequality 表来整合数据

在构建了四个核心表后,下一步是构建主表,整合来自所有四个表的数据。这个任务可能有些复杂,具体情况取决于您的源代码。对于这个用例,使用左外连接和右外连接就足以创建主表。清单 3 显示了相关代码。

清单 3. 构建主 Finance_Inequality 表的代码
CREATE table WorldBank_Finance_inequality.master_tbl_Finance_Inequality AS

SELECT
a.countrycode,
b.country,
a.year,
c.timeperiod,
a.loginitialgini,
a.growthingini,
a.span,
a.loginitialgdppercapita ,

a.growthgdppercapita,
a.privcreavg,
a.logprivatecredit,
a.inflation,
a.logtrade,
a.gr_ltrade,
a.gr_school,
a.logschooling,
a.logcommercialcentralbank,
a.loginitiallowestincomeshare, a.growthinlowestincomeshare,
d.logagedependency,
d.loginitialheadcount,

d.loginitialpovertygap,
d.growthinheadcount,
d.growthinpovertygap,
d.growthinmeanincome,
d.populationgrowth

FROM WorldBank_Finance_inequality.tbl_6005 A
LEFT OUTER JOIN

WorldBank_Finance_inequality.tbl_8005 B ON A.countrycode = B.countrycode
RIGHT OUTER JOIN

WorldBank_Finance_inequality.tbl_data_panel C ON A.countrycode = C.countrycode
LEFT OUTER JOIN

WorldBank_Finance_inequality.tbl_data_poverty D ON A.countrycode = D.countrycode
;

在运行这段代码后,就会有 315 个行或 314 个行,具体行数取决于您是否丢弃了标题行。有了这个主表,就可以对数据执行组合、汇总、删除和任何您希望执行的操作。显然,随着更深入的研究,您会发现数据质量问题或重复数据,但对于本用例,您已经使用 Hive 完成了 ELT,并通过转换工作构建了一个主数据库。

汇总表

为了对反规范化的主表中的数据进行汇总或执行分析,您有很多选择。您可以组合一些列;丢弃列;或加、减、乘,或者除几个列,并在一个新表中生成自己的派生列??。您需要有一个策略。也许您想找到人口增长和贫富差距之间的相关性。您可以运行复杂的 Hive SQL 查询来获取这些结果,但是,如果您想让自己或用户的工作变得更容易,那么可以考虑建立一个汇总表。

创建汇总表的过程类似于创建主表。在 Hive 中, 您可以使用选项,例如, 如果出现情况 A,则……样如果出现情况 B,则……样, 等。与传统的 RDBMS 相比,Hive 有其局限性,但凭借正确的理念和准备,您可以创建汇总查询,或创建更复杂的派生表。

运行查询

使用清单 4 中的代码运行一个查询。

清单 4. 在 Hive shell 中运行一个查询
use WorldBank_Finance_Inequality;
select countrycode, country,
CASE WHEN YEAR > 1990 then YEAR ELSE 0 END AS theYEAR,
populationgrowth, growthinpovertygap
FROM master_tbl_finance_inequality;

回页首

结束语

显然,在采用 ELT 或 ETL 理念之间进行选择是需要三思的。对于许多数据仓库、主数据管理和其他数据库项目而言,这个决定占用的时间可能是所需的规划时间的 70% 以上。有效的数据分析需要正确的数据。如果没有合适的数据,就无法获得准确的分析。

在这篇文章中,我们的用例显示,将数据转储到 HDFS,然后再考虑模式,这是比较容易做到的方法。本文在数据已经进入 HDFS 后开始建立 Hive 数据库,样本数据来自 Web 的 CSV 文件。但该数据可以来自任何来源,可以采用任何格式。在该示例将近结束时,我们确定了这些文件的布局、分隔符、变量和其他因素,然后再为该数据建立数据库并运行查询。

Hive 肯定有其局限性,但是,如果您在 Hadoop 生态系统中,而且已经了解 SQL,那么就可以利用这个奇妙的工具开始建立数据库、表流、转换和数据集成。这是一个相对简单的用例,在 Hive 和 Hadoop 中还可以建立更复杂的流程。

时间: 2024-11-05 14:58:13

使用 Hive 作为 ETL 或 ELT 工具的相关文章

从Oracle收购sunopsis看ETL和ELT产品的趋势

从Oracle收购sunopsis看ETL和ELT产品的趋势 日期:2008-6-17 来源:amteam    我要评论 大 | 中 | 小 投稿 打印 导读:本文主要从Oracle收购sunopsis分析ETL和ELT产品的趋势以及说明ELT工具比ETL工具能够处理大数据量效率更高的原因. 关键词:Oracle sunopsis ETL ELT 10月10日收到Oracle收购sunopsis的消息.开始觉得有些意外.仔细一考虑应该在情理之中. 第一,sunopsis采用ELT架构换句话说也

啥是ETL、ELT

ETL就是Extract.Transfrom.Load即抽取.转换.加载三个英文单词首字母的集合.抽取:就是从源系统抽取需要的数据,这些源系统可以是同构也可以是异构的:比如源系统可能是Excel电子表格.XML文件.关系型数据库,而目标系统通常都是关系型的数据仓库. 转换:源系统的数据按照分析目的,转换成目标系统要求的格式.其实这个名词并没有完全表达出这个步骤的目的,更准确的说法应该是数据清洗和数据加工. 加载:把转换后的数据装载到目标数据库.作为联机分析.数据挖掘的基础. 整个ETL过程就像是

数据分析你需要知道的操作:ETL和ELT

如果您接触过数据仓库, 您可能会使用 ETL (Extract. Transform. Load) 或 ELT ( Extract.Load. Transform) 将您的数据从不同的来源提取到数据仓库中.这些是移动数据或集成数据的常用方法, 以便您可以关联来自不同来源的信息, 将数据安全地存储在一个位置, 并使公司的成员能够从不同业务部门查看综合数据.ETL和ELT两个术语的区别与过程的发生顺序有关.这些方法都适合于不同的情况. 一.什么是ETL? ETL是用来描述将数据从来源端经过抽取(ex

【原创】BI解决方案选型之ETL数据整合工具对比

一.背景 在企业BI平台建设过程中,数据整合始终是一切的基础,简单BI项目可以通过存储过程来实现,而复杂.全面.多方异构数据来源等就大大增加了复杂性,存储过程的可管理性.可维护性.容错性等就无法很好的跟上企业的BI的发展脚步和需要. 因此,一个完善的.健壮的.可视化的.易于开发和管理的ETL解决方案,就非常重要,而这其中,ETL工具的地位不言而喻,更是重中之重.选择一个优秀的ETL工具,不仅可以加快异构数据整合的能力和效率,更能降低开发成本.人员手工维护等成本,好处多多. 现今的ETL工具很多,

Hadoop2.0集群、Hbase集群、Zookeeper集群、Hive工具、Sqoop工具、Flume工具搭建总结

实验开发环境所用软件: [[email protected] local]# ll total 320576 -rw-r--r-- 1 root root 52550402 Mar 6 10:34 apache-flume-1.6.0-bin.tar.gz drwxr-xr-x 7 root root 4096 Jul 15 10:46 flume drwxr-xr-x. 11 root root 4096 Jul 10 21:04 hadoop -rw-r--r--. 1 root root

系统设计与架构笔记:ETL工具开发和设计的建议

最近项目组里想做一个ETL数据抽取工具,这是一个研发项目,但是感觉公司并不是特别重视,不重视不是代表它不重要,而是可能不会对这个项目要求太高,能满足我们公司的小需求就行,想从这个项目里衍生出更多的东西估计难.昨天领导让我写写自己的见解,今天写了点,不过说见解还真不敢,所以取了个名字叫建议了,今天把这个文档贴到自己博客里和大伙分享分享. 贴文档之前,我想很多朋友估计并不熟悉ETL,如果接粗过数据挖掘一定对ETL很熟悉了,ETL是数据挖掘里非常重要的一环,具体什么是ETL,大家看下面这段文字: ET

Data Lake Analytics,大数据的ETL神器!

0. Data Lake Analytics(简称DLA)介绍 数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake.基于数据湖做分析,可以不用做任何ETL.数据搬迁等前置过程,实现跨各种异构数据源进行大数据关联分析,从而极大的节省成本和提升用户体验.关于Data Lake的概念. 终于,阿里云现在也有了自己的数据湖分析产品:https://www.aliyun.com/product/datalakeanalyt

Hive SQL的编译过程

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和性能对我们的数据分析非常关键. 在几次升级Hive的过程中,我们遇到了一些大大小小的问题.通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解.对这一过程的理解不仅帮助我们解决了一些Hive的bug,也有利于我们优化Hive SQL

Hive - 简介

一 概要介绍 Hive最初是应Facebook每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的,是建立在 Hadoop 上的数据仓库基础构架.作为Hadoop的一个数据仓库工具,Hive可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能. Hive 主要提供以下功能: 1. 它提供了一系列的工具,可用来对数据进行提取/转化/加载(ETL): 2. 是一种可以存储.查询和分析存储在HDFS(或者HBase)中的大规模数据的机制: 3. 查询是通过MapRedu