使用 Hive 构建数据仓库

举报
sunnyman218 发表于 2019/05/05 10:22:30 2019/05/05
【摘要】 介绍三个朋友给大家。第一个(数据仓库)身材魁梧:他带来了历史和经验,而且能言会道,所说的大部分话都是真的。但是,在许多方面,它有些自我膨胀,在另一些方面又有些铺张浪费,而且人们厌烦了各种结果的代价。Apache Hadoop 进入了同一栋建筑,声称要接管整个市场。他大肆鼓吹大数据、速度、数据量、种类以及一堆 v 开头的词汇,这些词汇在市场营销计划之外没有多大意义。他漫不经心地说着分析、预测等...

介绍三个朋友给大家。第一个(数据仓库)身材魁梧:他带来了历史和经验,而且能言会道,所说的大部分话都是真的。但是,在许多方面,它有些自我膨胀,在另一些方面又有些铺张浪费,而且人们厌烦了各种结果的代价。Apache Hadoop 进入了同一栋建筑,声称要接管整个市场。他大肆鼓吹大数据、速度、数据量、种类以及一堆 v 开头的词汇,这些词汇在市场营销计划之外没有多大意义。他漫不经心地说着分析、预测等等。而且他要价很低。于是人们开始停下来倾听。

Apache Hive 在屋外徘徊,他没有打算和其他人争论。他希望与 Hadoop 合作,但不同于 Hadoop,他不希望将数据仓库抛在路边。Hive 拥有数据仓库功能,但在商业智能 (BI) 和分析上有一些限制。它具有数据库的潜力,但也具有关系数据库管理系统 (RDBMS) 和结构化查询语言 (SQL) 方面的限制。它更加开放和诚实。它与数据仓库密切相关,与 RDBMS 也密切相关。但它从未站出来声称它并不像初看起来那么简单。Hadoop 打断了谈话,声称它是 Hadoop 领域的数据仓库。Hadoop 似乎让出了最优秀营销公关代表的地位,在一次简单的对话之后,结果变成了是 Hive 和 Hadoop 在拯救世界。这种描述很吸引人,也很有趣。但它是真的吗? 有几分相似。

数据仓库

构建一个真正的数据仓库可能是一个庞大的工程。有许多不同的设备、方法和理论。最大的共同价值是什么?事实是什么,哪些主题与这些事实相关?以及您如何混合、匹配、合并和集成可能已存在数十年的系统与仅在几个月前实现的系统?这还是在大数据和 Hadoop 之前。将非结构化、数据、NoSQL 和 Hadoop 添加到组合中,您很快就会得到一个庞大的数据集成项目。

描述一个数据仓库的最简单方式是,认识到可以将它归结为星形模式、事实和维度。您如何创建这些元素,决定权在您手上 — 通过暂存数据库;动态提取、转换、加载流程;或者集成辅助索引。当然,您可以构建一个包含星形模式、事实和维度的数据仓库,使用 Hive 作为核心技术,但这并不容易。在 Hadoop 世界外部,这会成为一个更大的挑战。与其说 Hive 是一种合法的数据仓库,倒不如说它是一个集成、转换、快速查找工具。该模式可能像是数据仓库,但适用性表明它不是 RDBMS。那么为什么使用它?

星形模式是什么

想象一颗星星 — 具有一个中心和多个指向不同方向的 “手臂”。中心是动力之源或事实表。所有手臂都指向不同维度。许多数据仓库有一个事实表和多个维度。

事实表包含您可以加权或计算的任何数据。在此示例中,您拥有棒球统计数据,比如跑垒、全垒打、击球率等。您可以计算、增加、减去或乘以这些列。

维度更加以主题为基础。在此示例中,您有运动员信息维度、时间和日期维度,等等。通常没有计算或加权多个维度中的列。

在此示例中,将一个维度表与一个事实表连接的键是 playerID。

简单来讲,有时您需要使用摆在面前的工具。

任何从事过一段时间的 IT 工作的人都可能告诉您,适合一项工作的正确工具并不总是能够用到。或者,正确的工具虽然用得到,但为了削减成本会阻碍使用该工具。有时企业政治学发挥着重大作用。无论什么原因,我们大部分人在很多情形下被迫使用可能并不是最适合其工作的工具来构建、设计和开发。

在我参与的许多项目中,我不得不使用 Hive 作为数据库、作为数据仓库以及作为缓慢变化的系统。这很有挑战性,但偶尔会令人生厌。有时,您不得不摇头并想知道为什么。但在一天结束时,您仍然需要让它工作。如果需要在 Hive 中构建和使用某个数据仓库,而且需要使用缓慢变化的维度和更新,并协调旧数据,那么您必须这么做。重点并不总是提供最佳的工具,而是创建最适合您工作的工具。

Hive

由于 Hive 的类 SQL 功能和类数据库功能,它向非编程人员开放了大数据 Hadoop 生态系统。它常被描述为一个构建于 Hadoop 之上的数据仓库基础架构。这是一种部分真实的表述(因为您可将源数据转换为星形模式),但在创建事实表和维度表时,它更关乎设计而不是技术。

尽管如此,Hive 并不真正是一个数据仓库。它甚至并不真正是一个数据库。您可以使用 Hive 构建和设计一个数据仓库,也可以使用 Hive 构建和设计数据库表,但存在的一些限制需要提供许多解决办法,并且将会带来一些挑战。

例如,索引在 Hive 中有一些限制。如何克服这个问题呢?您可以使用 org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler 函数在 Hive 中创建索引。Hive 和缓慢变化的维度并不总是可能实现。但是如果构建暂存表和使用一定量的连接(而且计划添加一个新表,转储旧表,并且只保留最新、更新表用于比较),则可能实现它们。

连接到 Hive 的外部报告或分析系统是一个巨大的问题。甚至对于 JDBC 连接,也仅限于连接到默认数据库。人们在寻求更多的经过改进的元数据,而且 Apache HCatalog 等工具正在帮助将各种服务连接到 Hive 元存储。在未来,如果利用得当,这可能是一个重大的增值区域。

所以,尽管 Hive 不是一个可靠的数据仓库或数据库,但仍然可以使用一些方法将 Hive 用作数据仓库或数据库。只是需要做一些工作和利用一些解决办法将 Hive 打造成这样的系统。为什么您要再次经历这一过程?因为您必须使用手头的工具并让它们发挥作用。

设计数据仓库

此数据对一个数据库而言是结构化数据,但对于数据仓库,您需要找出事实和维度。数据仓库设计很简单:您对该数据库进行反规范化,基于运动员统计数据创建一个事实表。然后基于与这些统计数据相关的某些主题区域来创建维度。在连接方面,Hive 表现不是很好,而 MapReduce 也好不了多少,所以拥有一个反规范化的星形模式对某些查询会有所帮助。

设计包含一个名为 fact_Player_Stats 的事实表,它包含各种 CSV 文件和表中包含的每个统计列。您需要使用来自核心表(Batting、Pitching 和 Fielding)的数据,以及来自一些补充表(它们也包含统计数据)的数据。因此,必须添加来自以下表的统计列:

AllStarFull

hall of Fame

BattingPost

PitchingPost

FieldingOF

Salaries

AwardsPlayers

AwardsSharePlayers

Appearances

SchoolsPlayers

一些表仅包含少数统计列。例如,在 FieldingOF 表中,您只需要将列 stint、Glf、Gcf 和 Grf 添加到 fact_Player_Stats 事实表。对于 SchoolsPlayers 表,只需获取 yearMin 和 yearMax 列。对其他表采取类似的步骤。事实表中仅需要统计列。

备注:您不会使用来自 Managers、Teams、TeamsHalf、SeriesPost 等表的任何数据。

fact_Player_Stats 事实表仅包含键 playerID、FranchID、yearID 和 SchoolID。对于维度表,您必须去掉统计数据(如果存在),仅保留与主题相关的列:

dim_Players 维度表从 Master 表中获取数据(运动员姓名、生日、传记信息)。主键为 playerID。

dim_TeamFranchise 维度表从 TeamFranchise 表中获取所有数据。主键为 FranchID。

dim_Schools 维度表从 Schools 表中获取所有数据。

dim_Year 是一个基于月份和年份的时间维度表 。

将数据库用于数据仓库

如果尚未创建棒球数据库,推荐您立即这么做,然后根据这些基础表来构建数据仓库。可通过编写复杂的脚本,从一个平面文件构建数据仓库,然后将同一个平面文件重用于另一个表,但对于本文,我选择使用之前在 “使用 Hive 为数据构建一个库” 中创建的数据库。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。