exportHIVE_HOME=/usr/local/hiveexportPATH=$PATH:$HIVE_HOME/binexportHADOOP_HOME=/usr/local/hadoopHADOOP_HOME需要被配置成你机器上Hadoop的安装路径,比如这里是安装在/usr/local./hadoop目录。保存退出后,运行如下命令使配置立即生效:
source~/.bashrc3.修改/usr/local/hive/conf下的hive-site.xml执行如下命令:
cd/usr/local/hive/confmvhive-default.xml.templatehive-default.xml上面命令是将hive-default.xml.template重命名为hive-default.xml;然后,使用vim编辑器新建一个配置文件hive-site.xml,命令如下:
cd/usr/local/hive/confvimhive-site.xml在hive-site.xml中添加如下配置信息:
tar-zxvfmysql-connector-java-5.1.40.tar.gz#解压cpmysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar/usr/local/hive/lib#将mysql-connector-java-5.1.40-bin.jar拷贝到/usr/local/hive/lib目录下3.启动并登陆mysqlshell
servicemysqlstart#启动mysql服务mysql-uroot-p#登陆shell界面4.新建hive数据库。
mysql>createdatabasehive;#这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据5.配置mysql允许hive接入:
mysql>grantallon*.*tohive@localhostidentifiedby'hive';#将所有数据库的所有表的所有权限赋给hive用户,后面的hive是配置hive-site.xml中配置的连接密码mysql>flushprivileges;#刷新mysql系统权限关系表6.启动hive启动hive之前,请先启动hadoop集群。
start-all.sh#启动hadoophive#启动hive注意,我们这里已经配置了PATH,所以,不要把start-all.sh和hive命令的路径加上。如果没有配置PATH,请加上路径才能运行命令,比如,本教程Hadoop安装目录是“/usr/local/hadoop”,Hive的安装目录是“/usr/local/hive”,因此,启动hadoop和hive,也可以使用下面带路径的方式:
在启动Hive时,有可能会出现Hivemetastoredatabaseisnotinitialized的错误,这里给出解决方案。解决Hive启动,Hivemetastoredatabaseisnotinitialized的错误。出错原因:以前曾经安装了Hive或MySQL,重新安装Hive和MySQL以后,导致版本、配置不一致。解决方法是,使用schematool工具。Hive现在包含一个用于HiveMetastore架构操控的脱机工具,名为schematool.此工具可用于初始化当前Hive版本的Metastore架构。此外,其还可处理从较旧版本到新版本的架构升级。所以,解决上述错误,你可以在终端执行如下命令:
schematool-dbTypemysql-initSchema执行后,再启动Hive,应该就正常了。启动进入Hive的交互式执行环境以后,会出现如下命令提示符:
hive>可以在里面输入SQL语句,如果要退出Hive交互式执行环境,可以输入如下命令:
hive>exit;三、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
主要实现的是将数据装载到表中(或是从表中导出),并进行相应查询操作,对熟悉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基础的用户而言是非常容易的。