技术开发 频道

使用Hive构建数据库 备战大数据时代

  如果您宁愿在一个更手动的环境中,那么可以从 Linux® 完成它,您需要创建一个目录,然后运行 wget:

  $ Sudo mkdir /user/baseball.

  sudo wget http:
//seanlahman.com/files/database/lahman2012-csv.zip

  该数据使用了 Creative Commons Attribution-ShareAlike 3.0 Unported 许可。

  压缩文件在 CSV 文件中,包含了棒球和棒球运动员的统计数据。示例中包含四个主表,每个表都只有一个列(Player_ID):

  Master table.csv—— 运动员姓名、出生日期和生平信息

  Batting.csv—— 击球统计

  Pitching.csv—— 投球统计

  Fielding.csv—— 接球统计

  辅表:

  AllStarFull.csv—— 全明星阵容

  Hall of Fame.csv—— 名人堂投票数据

  Managers.csv—— 管理统计

  Teams.csv—— 年度统计和排名

  BattingPost.csv—— 赛季后的击球统计

  PitchingPost.csv—— 赛季后的投球统计

  TeamFranchises.csv—— 加盟信息

  FieldingOF.csv—— 场外位置数据

  FieldingPost.csv—— 赛季后的现场数据

  ManagersHalf.csv—— 经纪人的分季数据

  TeamsHalf.csv—— 团队的分季数据

  Salaries.csv—— 球员薪资数据

  SeriesPost.csv—— 赛季后系列信息

  AwardsManagers.csv—— 经纪人奖项

  AwardsPlayers.csv—— 球员奖项

  AwardsShareManagers.csv—— 经纪人奖项投票

  AwardsSharePlayers.csv—— 球员奖项投票

  Appearances.csv

  Schools.csv

  SchoolsPlayers.csv

  设计数据库

  设计数据库的大部分内容已经完成。Player_ID 是四个主表(Master、Batting、Pitching 和 Fielding)的主键。(为了更好地理解表格结构和依赖性,请阅读 Readme2012.txt。)

  设计非常简单:主表是通过 Player_ID 连接的。Hive 并没有真的使用主键或者引用完整性的概念。Schema on Read 意味着 Hive 会摒弃您输入到表格中的所有内容。如果文件是混乱无序的,那么可能需要寻求连接它们的非常好的方法。此外,在将数据加载到 HDFS 或 Hive 之前,需要进行一些转化。根据 Schema on Rea 原理,不良数据在 Hive 中将彻底变成不良数据。这就是数据分析(无论是源级别的或者 HDFS 级别的)是一个重要步骤的原因。没有数据分析,最终获得的原始数据没有人可以使用。幸运的是,这个棒球的示例包含一些数据,这些数据在您输入 Hadoop 之前,已经被清理和组织到一起。

  将数据加载到 HDFS 或者 Hive

  将数据加载到 Hadoop 使用了很多不同的理论和实践。有时,您可以将原始文件直接输入到 HDFS。您可能会创建一个目录和子目录来组织文件,但是将文件从一个地方复制或移动到另一个位置是一个简单的过程。

  就这个示例来说,只需发出 put 命令,然后创建一个名为 baseball 的目录即可:

  Hdfs dfs -mkdir /user/hadoop/baseball

  hdfs dfs
-put /LOCALFILE /user/hadoop/baseball

  使用 Hive 构建数据库

  随着数据分析和设计的完成,下一步就是构建数据库了。

  虽然我没有介绍所有的示例,但是,如果跟随我构建了第一个示例,那么您就能够了解如何完成剩下的步骤。我通常会构建一些 SQL 文本脚本,然后将它们输入或者粘贴到 Hive。其他人可以使用 Hue 或其他工具来构建数据库和表格。

  为了简便起见,我们使用了 Hive Shell。高级步骤是:

  创建棒球数据库

  创建表格

  加载表格

  验证表格是正确的

  您会看到一些选项,例如,创建外部或者内部数据库和表格,但是在这个示例中,需要遵守内部默认设置。实际上,内部的 就意味着 Hive 处理了内部存储的数据库。清单 1 说明了 Hive shell 的流程。

  清单 1. 创建数据库

  $ Hive

  Create Database baseball;

  Create table baseball.Master

  ( lahmanID
int, playerID int, managerID int, hofID int, birthyear INT,

  birthMonth
INT, birthDay INT, birthCountry STRING, birthState STRING,

  birthCity
STRING, deathYear INT, deathMonth INT, deathDay INT,

  deathCountry
STRING, deathState STRING, deathCity STRING,

  nameFirst
STRING, nameLast STRING, nameNote STRING, nameGive STRING,

  nameNick
STRING, weight decimal, height decimal, bats STRING,

  throws
STRING, debut INT, finalGame INT,

  college
STRING, lahman40ID INT, lahman45ID INT, retroID INT,

  holtzID
INT, hbrefID INT )

  ROW FORMAT DELIMITED FIELDS TERMINATED BY
',' ;

  其他所有表也都遵守这个程序。为了将数据加载到 Hive 表,将会再次打开 Hive shell,然后运行以下代码:

  $hive

  LOAD DATA
LOCAL INPATH Master.csv OVERWRITE INTO TABLE baseball.Master;

  使用 Hive 构建标准化数据库

  这个棒球的数据库或多或少是标准化的:有四个主表和几个辅表。再次重申,Hive 是一个 Schema on Read,因此您必须完成数据分析和 ETL 阶段的大部分工作,因为没有传统 RDBMSes 中的索引或者引用完整性。如果您想要使用索引功能,那么下一步应该使用类似 HBase 的工具。请查看 清单 2 中的代码。

  清单 2. 运行一个查询

  $ HIVE

  Use baseball;

  
Select * from Master;

  
Select PlayerID from Master;

  
Select A.PlayerID, B.teamID, B.AB, B.R, B.H, B.2B, B.3B, B.HR, B.RBI

  FROM Master A
JOIN BATTING B ON A.playerID = B.playerID;

  结束语

  这就是 Hive 的优势以及构建数据库的好处:它为混沌的世界创建了结构。和我们喜欢讨论的非结构化或半结构化数据一样,它最终还是要了解谁可以分析数据,谁能基于它运行报告,以及您如何能够让它快速投入到工作中。大多数用户将 Hive 视为某种黑盒:他们不在意数据来自何处,也不在乎需要做什么才能以正确格式获取数据。也不会在意集成或者验证这些数据有多么困难,只要这些数据是精确的。这通常意味着您必须有组织和结构。否则,您的数据库会成为一个永久存储无限制数据的死区,没人能够或者想要使用这些数据。

  结构复杂的数据仓库已经风光不再。虽然近年情况有所好转,但是概念还是一样:这是一个业务,业务用户想要结果,而不是编程逻辑。这就是在 Hive 中构建数据库会成为正确开端的原因。

  更多精彩尽在2014年4月10日-12日在北京五洲皇冠国际酒店举办的第五届中国数据库技术大会,12月31日之前订票可享受6.8折最低票价

Facebook专家:Hadoop不足以处理大数据
▲进入官网了解更多详情

0
相关文章