大数据技术原理与应用第十四章基于Hadoop的数据仓库Hive学习指南(旧版已经废弃)

本指南介绍了Hive,并详细指引读者安装Hive。前面第几章学习指南已经指导大家安装Linux操作系统,并安装配置了Hadoop,但是这只表明我们已经安装好了Hadoop分布式文件系统,而Hive需要另外下载安装,本指南就是详细指导大家安装并配置Hive,完成后大家可以结合厦门大学林子雨开设的《大数据技术原理与应用》课程第14章节进行深入学习。

Hive是Facebook开发的构建于Hadoop集群之上的数据仓库应用,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。

Hive提供了一系列的工具,可以用来进行数据提取转化加载(ETL),其中,ETL是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。因此,Hive是最适合数据仓库应用程序的,它可以维护海量数据,而且可以对数据进行挖掘,然后形成意见和报告等。

因为大多数的数据仓库应用程序是基于SQL的关系数据库现实的,所以,Hive降低了将这些应用程序移植到Hadoop上的障碍。如果用户懂得SQL,那么学习使用Hive会很容易。因为Hive定义了简单的类SQL查询语言——HiveQL,这里值得一提的是,与SQLServer、Oracle相比,HiveQL和MySQL提供的SQL语言更接近。同样的,相对于其他的Hadoop语言和工具来说,Hive也使得开发者将基于SQL的应用程序移植到Hadoop变得更加容易。

下面开始安装Hive。

cd~/下载sudotar-zxvf./apache-hive-1.2.1-bin.tar.gz-C/usr/local#解压到/usr/local中cd/usr/local/sudomv./apache-hive-1.2.1-bin/./hive#将文件夹名改为hivesudochown-Rhadoop:hadoop./hive#修改文件权限mkdir-p/usr/local/hive/warehouse#创建元数据存储文件夹sudochmoda+rwx/usr/local/hive/warehouse#修改文件权限为了方便使用,我们把hive命令加入到环境变量中去,需要使用以下命令编辑.bashrc文件:

vim~/.bashrc#设置环境变量进入.bashrc编辑状态以后,需要在文件最前面添加如下几行:

exportHIVE_HOME=/usr/local/hiveexportPATH=$PATH:$HIVE_HOME/bin完成上述操作后,需要运行以下命令让配置生效:

source~/.bashrc#使配置立即生效然后运行hive命令启动Hive,命令如下:

hive#启动Hive当出现以下界面即为启动成功。

Hive启动失败:若启动不成功,则会出现以下错误:

则需要进入到hadoop安装目录下的share/hadoop/yarn/lib下删除jline-0.9.94.jar文件,再启动hive即可(因为高版本的Hadoop对Hive有捆绑)。

通过Hadoop的学习我们已经知道,Hadoop的运行模式有三种:本地模式、伪分布式模式和分布式模式。这里我们以介绍本地模式为主,其他模式只进行简单介绍。因为,本地模式是Hadoop的默认模式,所以,Hadoop不需要进行其他配置,我们只需对Hive进行相应配置。这里只需修改hive-site.xml文件,如果该文件不存在,用户需要自己新建一个。(注意:在$HIVE_HOME/conf目录下我们可能会看到hive-default.xml.template这个大文件,这个文件中包含了Hive提供的配置属性以及默认的属性值,这些属性中的绝大多数,用户可以忽略不管)。

在安装Hive时,默认情况下,元数据存储在Derby数据库中。Derby是一个完全用Java编写的数据库,所以可以跨平台,但需要在JVM中运行。因为多用户和系统可能需要并发访问元数据存储,所以默认的内置数据库并不适用于生产环境。任何一个适用于JDBC进行连接的数据库都可用作元数据库存储,这里我们把MySQL作为存储元数据的数据库。接下来,我们分别对这两种方式进行介绍,即使用Derby数据库的方式和使用MySQL数据库的方式。

本地模式中,用户的“表”等元数据信息,都默认存储在file://user/hive/warehouse,对于其他模式默认存储路径是hdfs://namenode_server/user/hive/warehouse。使用如下命令编辑hive-site.xml文件:

vim/usr/local/hive/conf/hive-site.xml在hive-site.xml文件添加以下内容:

Hive配置完成后,下面来启动它,并使用简单的HiveQL命令进行相应测试。我们先新建了一个表x,它有1个int型属性a,然后查找表x中的所有属性,最后删除表x,然后退出。HiveQL命令与SQL命令很相似,所以,读者如果有SQL基础的话,会很快上手。关于HiveQL命令的使用方法会在第4节详细介绍。

注意,命令最后需要以分号“;”结束。

sudorpm-e--nodepsmysql-libs-xxxxxxb.安装MySQL,命令如下:

sudoapt-getinstallmysql-serverc.启动设置MySQL,命令如下:

insertintomysql.user(Host,User,Password)values("localhost","hive",password("hive"));#创建hive用户createdatabasehive;#创建hive数据库grantallonhive.*tohive@'%'identifiedby'hive';grantallonhive.*tohive@'localhost'identifiedby'hive';flushprivileges;exit#退出mysqlmysql-uhive-phive#验证hive用户showdatabases;看到以下信息,则说明创建成功。

2)配置Hive,修改hive-site.xml文件,修改后的结果如下:

mv~/下载/mysql-connector-java-5.1.30-bin.jar/usr/local/hive/lib/#拷贝mysql-connector-java-5.1.30-bin.jar到hive的lib下cp/usr/local/hive/lib/jline-2.12.jar/usr/local/hadoop/share/hadoop/yarn/lib#把jline-2.12.jar拷贝到hadoop相应目录下mkdir-p/usr/local/hive/tmp#创建hive临时文件夹sudochmoda+rwx/usr/local/hive/tmp#修改文件权限接下来,启动测试Hive。首先启动Hadoop后,执行Hive命令hive,并输入showdatabases;进行测试。

hiveclient常用命令可以通过hive--help查看。下面再介绍一些hiveclient常用命令,用户可以自行测试:

showtables;#查看所有表名showtables'ad*';#查看以'ad'开头的表名set命令#设置变量与查看变量set–v;#查看所有的变量sethive.stats.atomic;#查看hive.stats.atomic变量sethive.stats.atomic=false;#设置hive.stats.atomic变量hadoopdfs-ls/;#查看hadoop所有文件路径dfs-ls/usr/local/hive/warehouse/;#查看hive所有用戶dfs-ls/tmp;#查看dfs中內容sourcefile#在client里执行一个hive脚本文件quit;#退出交互式shellexit#退出交互式shellreset#重置配置为默认值!ls#从Hiveshell执行一个shell命令四、Hive的常用HiveQL操作1)Hive基本数据类型

首先,我们简单叙述一下HiveQL的基本数据类型。

Hive支持基本数据类型和复杂类型,基本数据类型主要有数值类型(INT、FLOAT、DOUBLE)、布尔型和字符串,复杂类型有三种:ARRAY、MAP和STRUCT。

a.基本数据类型

b.复杂数据类型

2)常用的HiveQL操作命令

Hive常用的HiveQL操作命令主要包括:数据定义、数据操作。接下来详细介绍一下这些命令即用法(想要了解更多请参照《Hive编程指南》一书)。

a.数据定义:主要用于创建修改和删除数据库、表、视图、函数和索引。

创建、修改和删除数据库

createdatabaseifnotexistshive;#创建数据库showdatabases;#查看Hive中包含数据库showdatabaseslike'h.*';#查看Hive中以h开头数据库describedatabases;#查看hive数据库位置等信息alterdatabasehivesetdbproperties;#为hive设置键值对属性usehive;#切换到hive数据库下dropdatabaseifexistshive;#删除不含表的数据库dropdatabaseifexistshivecascade;#删除数据库和它中的表注意,除dbproperties属性外,数据库的元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置,没有办法删除或重置数据库属性。

创建、修改和删除表

主要语法如下,用户可自行实现。

createviewview_nameas....;#创建视图alterviewview_namesettblproperties(…);#修改视图因为视图是只读的,所以对于视图只允许改变元数据中的tblproperties属性。

#删除视图dropviewifexistsview_name;#创建索引createindexindex_nameontabletable_name(partition_name/column_name)as'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'withdeferredrebuild....;这里'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'是一个索引处理器,即一个实现了索引接口的Java类,另外Hive还有其他的索引实现。

alterindexindex_nameontabletable_namepartition(...)rebulid;#重建索引如果使用deferredrebuild,那么新索引成空白状态,任何时候可以进行第一次索引创建或重建。

showformattedindexontable_name;#显示索引dropindexifexistsindex_nameontabletable_name;#删除索引用户自定义函数

在新建用户自定义函数(UDF)方法前,先了解一下Hive自带的那些函数。showfunctions;命令会显示Hive中所有的函数名称:

若想要查看具体函数使用方法可使用describefunction函数名:

首先编写自己的UDF前需要继承UDF类并实现evaluate()函数,或是继承GenericUDF类实现initialize()函数、evaluate()函数和getDisplayString()函数,还有其他的实现方法,感兴趣的用户可以自行学习。

另外,如果用户想在Hive中使用该UDF需要将我们编写的Java代码进行编译,然后将编译后的UDF二进制类文件(.class文件)打包成一个JAR文件,然后在Hive会话中将这个JAR文件加入到类路径下,在通过createfunction语句定义好使用这个Java类的函数。

addjar;#创建函数createtemporaryfunctionfunction_name;droptemporaryfunctionifexistsfunction_name;#删除函数3)数据操作

主要实现的是将数据装载到表中(或是从表中导出),并进行相应查询操作,对熟悉SQL语言的用户应该不会陌生。

向表中装载数据

这里我们以只有两个属性的简单表为例来介绍。首先创建表stu和course,stu有两个属性id与name,course有两个属性cid与sid。

createtableifnotexistshive.stu(idint,namestring)rowformatdelimitedfieldsterminatedby'\t';createtableifnotexistshive.course(cidint,sidint)rowformatdelimitedfieldsterminatedby'\t';向表中装载数据有两种方法:从文件中导入和通过查询语句插入。

a.从文件中导入

假如这个表中的记录存储于文件stu.txt中,该文件的存储路径为usr/local/hadoop/examples/stu.txt,内容如下。

stu.txt:

1xiapi2xiaoxue3qingqing下面我们把这个文件中的数据装载到表stu中,操作如下:

loaddatalocalinpath'/usr/local/hadoop/examples/stu.txt'overwriteintotablestu;如果stu.txt文件存储在HDFS上,则不需要local关键字。

b.通过查询语句插入

使用如下命令,创建stu1表,它和stu表属性相同,我们要把从stu表中查询得到的数据插入到stu1中:

createtablestu1asselectid,namefromstu;上面是创建表,并直接向新表插入数据;若表已经存在,向表中插入数据需执行以下命令:

insertoverwritetablestu1selectid,namefromstuwhere(条件);这里关键字overwrite的作用是替换掉表(或分区)中原有数据,换成into关键字,直接追加到原有内容后。

从表中导出数据

a.可以简单拷贝文件或文件夹

命令如下:

hadoopfs-cpsource_pathtarget_path;b.写入临时文件

insertoverwritelocaldirectory'/usr/local/hadoop/tmp/stu'selectid,namefromstu;查询操作

和SQL的查询完全一样,这里不再赘述。主要使用select...from...where...等语句,再结合关键字groupby、having、like、rlike等操作。这里我们简单介绍一下SQL中没有的case...when...then...句式、join操作和子查询操作。

case...when...then...句式和if条件语句类似,用于处理单个列的查询结果,语句如下:

selectid,name,casewhenid=1then'first'whenid=2then'second'else'third'结果如下:

连接连接(join)是将两个表中在共同数据项上相互匹配的那些行合并起来,HiveQL的连接分为内连接、左向外连接、右向外连接、全外连接和半连接5种。

a.内连接(等值连接)内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

首先,我们先把以下内容插入到course表中(自行完成)。

132131下面,查询stu和course表中学号相同的所有行,命令如下:

selectstu.*,course.*fromstujoincourseon(stu.id=course.sid);执行结果如下:

selectstu.*,course.*fromstuleftouterjoincourseon(stu.id=course.sid);执行结果如下:

c.右连接右连接是左向外连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。命令如下:

selectstu.*,course.*fromsturightouterjoincourseon(stu.id=course.sid);执行结果如下:

d.全连接全连接返回左表和右表中的所有行。当某行在另一表中没有匹配行时,则另一个表的选择列表包含空值。如果表之间有匹配行,则整个结果集包含基表的数据值。命令如下:

selectstu.*,course.*fromstufullouterjoincourseon(stu.id=course.sid);执行结果如下:

e.半连接半连接是Hive所特有的,Hive不支持in操作,但是拥有替代的方案;leftsemijoin,称为半连接,需要注意的是连接的表不能在查询的列中,只能出现在on子句中。命令如下:

selectstu.*fromstuleftsemijoincourseon(stu.id=course.sid);执行结果如下:

子查询标准SQL的子查询支持嵌套的select子句,HiveQL对子查询的支持很有限,只能在from引导的子句中出现子查询。

注意,在定义或是操作表时,不要忘记指定所需数据库。

下面我们以词频统计算法为例,来介绍怎么在具体应用中使用Hive。词频统计算法又是最能体现MapReduce思想的算法之一,这里我们可以对比它在MapReduce中的实现,来说明使用Hive后的优势。

MapReduce实现词频统计的代码可以通过下载Hadoop源码后,在$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar包中找到(wordcount类),wordcount类由63行Java代码编写而成。下面首先简单介绍一下怎么使用MapReduce中wordcount类来统计单词出现的次数,具体步骤如下:

1)创建input目录,output目录会自动生成。其中input为输入目录,output目录为输出目录。命令如下:

cd/usr/local/hadoopmkdirinput2)然后,在input文件夹中创建两个测试文件file1.txt和file2.txt,命令如下:

cd/usr/local/hadoop/inputecho"helloworld">file1.txtecho"hellohadoop">file2.txt3)执行如下hadoop命令:

cd..hadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jarwordcountinputoutput4)我们可以到output文件夹中查看结果,结果如下:

下面我们通过HiveQL实现词频统计功能,此时只要编写下面7行代码,而且不需要进行编译生成jar来执行。HiveQL实现命令如下:

createtabledocs(linestring);loaddatainpath'input'overwriteintotabledocs;createtableword_countasselectword,count(1)ascountfrom(selectexplode(split(line,''))aswordfromdocs)wgroupbywordorderbyword;执行后,用select语句查看,结果如下:

由上可知,采用Hive实现最大的优势是,对于非程序员,不用学习编写JavaMapReduce代码了,只需要用户学习使用HiveQL就可以了,而这对于有SQL基础的用户而言是非常容易的。

THE END
1.数据库编程总结carekee2、VC数据库编程几种方法 VC数据库编程几种方法,包括ODBC连接、MFC ODBC连接、DAO连接、OLE DB、OLE DB Templates连接、ADO、Oracle专用方法(OCI(Oracle Call Interface)访问、Oracle Object OLE C++ Class Library )。 <1.>通用方法 1. ODBC连接 ODBC(Open DataBase Connectivity)是MSOA的一部分,是一个标准数据...https://www.cnblogs.com/carekee/articles/1749649.html
2.Oracle数据库PLSQL开发OracleSQL开发习题答案1.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入(需考虑奖金部分),要求显示格式为:XXX的第一年总收入为XXX。 2.查询员工表中一共有哪几种岗位类型。 课后作业 1.分别选择员工表、部门表、薪资等级表中的所有数据 2.分别查看员工表、部门表、薪资等级表结构。 https://www.jianshu.com/p/5a482617fbef
1.简单数据库制作,教你用C语言创建自己的数据库!!!简单数据库制作,教你用C语言创建自己的数据库!!! 作品名称:《数据录入与存储》 作品介绍: 《数据录入与存储》是一个用C语言编写的简单程序,主要用于从用户处接收一系列整数数据,并将这些数据存储到一个数组中,最后将数组中的数据追加到一个文件中。 程序的主要功能如下:...https://download.csdn.net/blog/column/12550940/135725657
2.使用java语言编写一个简单的数据库管理系统使用java语言编写一个简单的数据库管理系统 演示:如何创建一个普通的Java工程,并导入MySql数据库的驱动包,用JDBC方式来连接数据库。 Intellj Idea 先创建工程 1、打开Intellij Idea,创建Project,File->New->Project,如图所示: 2、指定JDK安装目录,再点击Next...https://blog.51cto.com/u_19261/12517633
3.Java实现定时任务的方法总结java修改admin下的配置文件:邮箱、数据库连接(jdbc:mysql://localhost:3306/xxl_job?serverTimeZone=Asia/Shanghai) 运行启动类 访问http://localhost:8080/xxl-job-admin 默认账户admn,密码123456 编写一个自己的代码 在页面中添加定时任务并启动运行 运行报错:执行器地址为空 打开页面中的执行器管理,新增一条 Appnam...https://www.jb51.net/program/2903277t8.htm
4.学完这篇Nest.js实战,还没入门的来锤我!(长文预警)到此我们认识了Controller、Service、Module、路由以及一些常用的装饰器, 那接下来就实战一下,我们以开发文章(Post)模块作为案例, 实现文章简单的CRUD,带大家熟悉一下这个过程。 编写代码 写代码之前首先介绍几个nest-cli提供的几个有用的命令: 代码语言:javascript ...https://cloud.tencent.com/developer/article/1907958
5.数据库课程设计指导书6篇(全文)数据库是信息系统的核心和基础,它把信息系统中大量的数据按一定的模型组织起来,提供存储、维护、检索数据的功能,使信息系统可以方便、及时、准确地从数据库中获得所需的信息。 数据库设计是信息系统开发和建设的重要组成部分。 数据库设计的基本任务是:对于一个给定的应用领域,设计优化的数据库逻辑和物理结构,使之满足...https://www.99xueshu.com/w/filea0fwsq7u.html
6.java毕业实习报告(精选11篇)本次的实习内容主要包括:对登录管理系统有一个初步的构思及确定其应该包括哪些模块实现什么功能;对SQL的基础知识的理论学习;理论联系实际对SQL进行具体操作;学会用SQL建数据库及所需表格的具体方法;理解连接SQL数据库的语句及能正确的应用于实践;完成简单的登录系统;软件初步测试。https://www.fwsir.com/Article/html/Article_20141119170516_283897.html
7.计算机应用专业毕业实习报告(精选15篇)我的岗位为电脑程序编写,即用filemake软件编写能调用资料库中的信息的程序,然后再用VB软件编写一个能将filemake中所调用的信息导入到indesign软件并实现某些功能的引擎,我工作主要任务有以下几点: (1)、了解各类单的特点,学会看单,做到能看懂单、熟练的区分各种不同的单,对于单中出现的错误能作出立刻反应,明白经常...https://www.ruiwen.com/shixibaogao/5142259.html
8.MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射作用:将数据连接单独配置在db.properties中,只需要在myBatisConfig.xml中加载db.properties的属性值,在myBatisConfig.xml中就不需要对数据库连接参数进行硬编码。数据库连接参数只配置在db.properties中,方便对参数进行统一管理,其它xml可以引用该db.properties。 https://www.west.cn/info/html/chengxusheji/Javajishu/20181008/4596398.html
9.asp.net基础笔试题全解完整答案3、SqlConnection 用来创建一个到数据库的连接 4、SqlCommand 用来执行SQL语句 5、SqlDataReader 用来顺序读取数据 6、SqlDataAdapter 用来将数据填充到DataSet或DataTable 10.UDP连接和TCP连接的异同。 前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连接. ...https://www.yjbys.com/bishi/timu/926386.html
10.Awesome最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串。(leet code 14) 最简单的办法就是循环迭代查找,该方法时间复杂度和空间复杂度均很低,而且容易想到。除此之外,还可以使用分治的方法,但是结果并没有更优秀 class Solution { public: string lon...https://github.com/Ty-Chen/Awesome-Backend/blob/5ad253a0f2e82d9b83892a60e01a1e0a855d70b3/Data%20Structure%20and%20Algorithm.md
11.ASP.NETCore适用于.NET的开源Web框架.NET 是一个开发人员平台,由工具、编程语言、库组成,用于构建许多不同类型的应用程序。 ASP.NET Core 通过专门用于生成 web 应用的工具和库扩展了.NET 开发人员平台。 更深入发掘: 什么是 ASP.NET Core? 了解ASP.NET Core 通过我们的教程、视频课程和文档,了解 ASP.NET Core 提供的所有功能。 https://asp.net/
12.Alibaba最新1000多道Java面试题汇总详解,收藏起来慢慢刷!我分享的这份春招 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点,都是小编在各个大厂总结出来的面试真题,已经有很多粉丝...https://maimai.cn/article/detail?fid=1728969401&efid=esjJLvGGL4fAr1LArgq_cQ
13.NavicatPremiumLite简单的数据库管理和开发工具在一个干净直观的界面中,使用代码补全、代码段和语法高亮显示加速你的编码过程。Navicat 为你提供无缝的编码环境,让你可以更快地编写高质量的代码,并且减少错误。 导入和导出 导入和导出各种基于文本的文件(如 TXT、CSV、XML 和 JSON)中的数据。将外部来源的数据导入数据库,以及从数据库中提取数据并将其保存为不同...https://www.navicat.com.cn/products/navicat-premium-lite
14.计算机二级C语言考试冲刺练习题【解析】内模式也称存储模式,它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述。所以选项A)正确。 5、 在满足实体完整性约束的条件下 A、一个关系中可以没有候选关键词 ...https://www.oh100.com/kaoshi/ncre2/tiku/538366.html
15.数据库设计(精选十篇)此阶段的主要工作是将上阶段的概念结构转换为某个数据库管理系统支持的数据模型, 并进行优化。逻辑结构应该选择最适合表达概念结构的数据模型, 然后选择最适合的数据库刮泥系统。将实体的属性、实体和实体间的联系转化为关系模式实际就是将E-R图转换为关系模型的过程。 3.3 数据库物理设计阶段 这一阶段的主要目的是...https://www.360wenmi.com/f/cnkeyl762svr.html