一:Hive基本介绍
Hive是建立在Hadoop上的数据仓库基础构架,它提供了一系列工具可以用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模的数据机制。
使用语言:QL语言(类SQL查询语言)。能处理内建的mapper和reducer无法完成的复杂分析工作。
1.Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后再Hadoop执行。
2.Hive的表其实是HDFS的目录(/文件夹),按表名把文件夹区分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。
二:Hive的系统架构
1.用户接口主要有三个:CLI,JdbC/ODBC,WebUI
(1)CLI,即shell命令行。
(2)JDBC/ODBC,是Hive的Java接口,与使用传统数据库JDBC方式类似。
(3)WebUI,是通过浏览访问Hive。
2.Hive将元数据存储在数据库(metastore)中,目前只支持MySQL,derby。(Hive中的元数据包括表名,表列,和分区及其属性,表属性,表的数据所在目录等)
3.解析器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS中,并在随后有MapReducer调用执行。
4.Hive的数据存储在HDFS中,大部分的查询由MapReducer完成(包括含*的查询,比如select * from table不会生成MapReducer任务)。
三:Hive的安装
Hive只需在集群中的一个节点安装,Hive的默认是将元数据以derby的方式存储(在哪个目录下运行Hive,就在哪个目录下生成metastore_db数据库保存元数据,不利于多台client操作Hive)。
so:先安装MySQL数据库
1.rpm -ivh Mysql-Server.rpm
2.rpm -qa | grep mysql //过滤出MySQL包
3.rpm -e mysql-lib... --nodeps //强行删除上一布中过滤出的MySQL包
4.运行/usr/bin/mysql_secure_installation //配置登陆用户名&密码
5.mysql --uroot -p123 //进入MySQL....按照成功
//把MySQL作为Hive的metastore
//下面即配置Hive
1.删除hdfs上的Hive目录
hadoop fs -rmr /user/hive
2.修改conf配置文件
添加如下内容:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://centos:3308/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value>
<description>password to use against metastore database</description>
</property>
3.安装hive和mysq完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)
mysql -uroot -p #(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址或主机都可以连接)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
四:Hive语法
1.查看表(数据库)
show tables(database);
2.创建表(列之间以'\t'做分隔符)
create table student(id bigint,name string) row format delimited fields terminated by '\t';
3.上传数据
load data local inpath '/usr/local/xx.txt' into table student;
4.创建一张外部表
create external table ext_student (id int,name string) row format delimited fields terminated by '\t' location '/data';
5.创建分区表
create external table people (id int, name string) partitioned by (nation string) row format delimited fields terminated by '\t' location '/people';
6.分区表添加数据(指定分区)
load data local inpath '/usr/local/xx.txt' into table people partition(nation='China');
7.暴力方式:
手动在HDFS中创建一个分区的文件夹,往里面添加数据。
问题:select查询不到语句
原因:手动方式是元数据没有在数据库中记录。
解决:暴力方式往数据库中添加分区信息
在Hive中运行:
alter table people add partition(nation="Japan") location '/people/nation=Japan';
8.分区查询
select * from people where nation="China";
9.使用sqoop工具将MySQL中的表数据远程导入HDFS下的Hive目录中
sqoop import --connect jdbc:mysql://192.168.56.1:3308/hive_test --username root --password 123 --table people_info --hive-import --hive-overwrite --hive-table people_info --fields-terminated-by '\t';
PS:一定将Hive加入环境变量中。
五:Hive的UDF
1.注册UDF
add jar /jar目录
2.创建临时函数
create temporary function getNation(调用的函数名) as 'cn.hive.udf.NationUDF'(对应的函数)
4.执行列子
select id,name,getNation(nation) from people ;