目录
Hive概述
产生背景
Hive是什么
为什么要使用Hive
Hive在Hadoop生态圈中的位置
Hive体系架构
Hive部署架构
Hive和RDBMS的区别
Hive部署
HIve DDL
数据库操作
表操作
Hive DML
创建表
加载数据到hive
基本统计
聚合
分组函数
join
执行计划
关于外部表和内部表
Hive shell一些小命令
把SQL翻译成MapReduce,跑在Hadoop之上,在使用查询和管理的过程中可能会涉及到一些表一些数据库,因为Hive是基于表来操作的,这些表和数据库都是作为元数据信息存放在Metastore里面的,这个Metastore是存放在MySQL里面的。
Hive是一个客户端,不涉及集群的概念,需要在哪个机器上使用Hive操作,直接在哪台机器上布上 Hive的软件包就行了
我用的是mac,下载hive-1.1.0-cdh5.15.1.tar.gz,因为之前Hadoop选择的版本是hadoop-2.6.0-cdh5.15.1,所以hive也必须选择cdh5.15.1,这边的mysql下载的是5.6.40,mysql直接下载的dmg格式,直接一路点点点。
hive-env.sh
HADOOP_HOME:若添加到系统环境变量,通常不需要配,不过配一下也没事
hive-site.xml
需要配置元数据存储的地方,所以这边只需要配置一些MySQL的信息
拷贝MySQL驱动包到$HIVE_HOME/lib下
前提是要准备安装一个MySQL数据库,yum install 去安装一个MySQL数据库
hive-site.xml的配置
javax.jdo.option.ConnectionURL
jdbc:mysql://hadoop000:3306/hadoop_hive?createDatabaseIfNotExist=true
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
123456
DDL:Hive Data Definition Language【create、delete、alter...】
Hive数据抽象/结构:
HiveQL DDL statements are documented here, including:
PARTITION statements are usually options of TABLE statements, except for SHOW PARTITIONS.
命令:create database
[]:中括号里面可选, |:多选一
CREATE [REMOTE] (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment] // 加一个注释
[LOCATION hdfs_path] // hdfs上一个目录
[MANAGEDLOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
CREATE DATABASE IF NOT EXISTS hive
;
// 通常会加上IF NOT EXISTS
CREATE DATABASE IF NOT EXISTS hive2 LOCATION '/test/location'
;
// 更改路径CREATE DATABASE IF NOT EXISTS hive3
WITH DBPROPERTIES ("creator"="hh");
/user/hive/warehouse:这个是HIve默认的存储在HDFS上的路径,这个路径是可以更改的。
举个
hive> show databases;
OK
default
hive
hive2
test_db
Time taken: 0.036 seconds, Fetched: 4 row(s)
在hive中一共有三个数据库,我们去MySQL上看一下哈,hadoop_hive这个数据库是我们在hive-site.xml里面配置的
mysql> use hadoop_hive;
Database changed
mysql> select * from DBS \G;
*************************** 1. row ***************************
DB_ID: 1
DESC: Default Hive database
DB_LOCATION_URI: hdfs://localhost:8020/user/hive/warehouse
NAME: default
OWNER_NAME: public
OWNER_TYPE: ROLE
*************************** 2. row ***************************
DB_ID: 2
DESC: NULL
DB_LOCATION_URI: hdfs://localhost:8020/user/hive/warehouse/test_db.db
NAME: test_db
OWNER_NAME: dinghui
OWNER_TYPE: USER
*************************** 3. row ***************************
DB_ID: 3
DESC: NULL
DB_LOCATION_URI: hdfs://localhost:8020/user/hive/warehouse/hive.db
NAME: hive
OWNER_NAME: dinghui
OWNER_TYPE: USER
*************************** 4. row ***************************
DB_ID: 4
DESC: NULL
DB_LOCATION_URI: hdfs://localhost:8020/test/location
NAME: hive2
OWNER_NAME: dinghui
OWNER_TYPE: USER
4 rows in set (0.00 sec)
ERROR:
No query specified
我们来看看
("creator"="hh")
这个的显示:desc database extended hive3;hive> desc database extended hive3;
OK
hive3 hdfs://localhost:8020/user/hive/warehouse/hive3.db hh USER {creator=hh}
Time taken: 0.034 seconds, Fetched: 1 row(s)
hive> desc database extended hive2;
OK
hive2 hdfs://localhost:8020/test/location dinghui USER
hive> desc database hive3;
OK
hive3 hdfs://localhost:8020/user/hive/warehouse/hive3.db dinghui USER
在控制台上显示现在操作的数据库
hive> set hive.cli.print.current.db;
hive.cli.print.current.db=false
hive> set hive.cli.print.current.db=true;
hive (test_db)> !clear // 清除屏幕上的显示
删除数据库
drop database test_db; // 若test_db中没有表,执行该语句会成功删掉test_db库;若里面有表,则不能,此时若还想删除,可以添加CASCADE,则无论有没有表都可以删掉该数据库,有表的话,连带表一起删除,要慎用,尤其生产环境,保险起见还是一张表一张表的删比较好。
hive (test_db)> drop database test_db;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database test_db is not empty. One or more tables exist.)
hive (test_db)> drop database test_db CASCADE;
hive (test_db)> show databases;
default
hive
hive2
like的用法
hive (test_db)> show databases;
default
hive
hive2
hive (test_db)> show databases like "hive*";
hive
hive2
命令:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14
.
0
and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive
0.10
.
0
and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY
'storage.handler.class.name'
[WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive
0.6
.
0
and later)
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive
0.6
.
0
and later)
[AS select_statement]; -- (Note: Available in Hive
0.5
.
0
and later; not supported
for
external tables)
创建表
CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
查看表结构,此处可以看到字段名、类型
hive (default)> desc emp;
显示详细信息,但是显示不够人性化,所以通常不用
desc extended emp;
通常用这条命令,现实详细信息
desc formatted emp;
将数据导入hive表
LOAD DATA LOCAL INPATH '/Users/dinghui/data/emp.txt' OVERWRITE INTO TABLE emp;
/user/hive/warehouse/emp/emp.txt
ALTER TABLE emp RENAME TO emp2;
/user/hive/warehouse/emp2/emp.txt
我们对表改名,体现在hdfs的目录上,下面的数据文件emp.txt的名字不受影响,因为表名对应其上一级的文件名。
DML:Data Manipulation Language
CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
查看表结构,此处可以看到字段名、类型
hive (default)> desc emp;
显示详细信息,但是显示不够人性化,所以通常不用
desc extended emp;
通常用这条命令,现实详细信息
desc formatted emp;
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA LOCAL INPATH '/Users/dinghui/data/emp.txt' OVERWRITE INTO TABLE emp;
/user/hive/warehouse/emp/emp.txt
ALTER TABLE emp RENAME TO emp2;
/user/hive/warehouse/emp2/emp.txt
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
LOCAL: 本地系统,若没有LOCAL就是指HDFS路径
OVERWRITE:是否数据覆盖,若没有就是数据追加
// hive下使用load data:load data inpath ‘hdfs://hadoop000:8020/data/emp.txt’ into table emp;/data目录下的emp.txt就没了
// 这个其实是一个移动的过程,把data下的移动到你的hive表的目录下面去了
LOAD DATA INPATH 'hdfs://localhost:8020/data/emp.txt' INTO TABLE emp;
LOAD DATA INPATH 'hdfs://localhost:8020/data/emp.txt' OVERWRITE INTO TABLE emp;
从下面我们可以看出,表格对应目录,表格中的内容对应目录下的文件,查询的时候table名对应目录名,和里面的文件名木有任何关系。
create table emp1 as select * from emp;
/user/hive/warehouse/emp1/000000_0
create table emp2 as select empno, ename from emp;
/user/hive/warehouse/emp2/000000_0
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
SELECT ... FROM ...
// 若没有hive目录会创建,若存在hive目录,且hive目录非空,则会覆盖,即之前hive目录下的文件全部被删除
INSERT OVERWRITE LOCAL DIRECTORY '/Users/dinghui/MyTmp/hive/'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select empno, ename, sal, deptno from emp;
INSERT OVERWRITE LOCAL DIRECTORY '/Users/dinghui/MyTmp/'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select empno, ename, sal, deptno from emp;
大数据hive中不推荐使用insert插入一条数据和update更改一条数据,这种操作很耗性能,且有可能产生小文件,
若要操作,建议用NoSQL数据库
简单查询,不需要跑mapreduce,很快就可以出结果
// between and [],左闭右闭
select * from emp where sal between 800 and 1500;
select * from emp where ename in ('SMITH', "MARTIN");
select * from emp where ename not in ('SMITH', "MARTIN");
select * from emp where comm is null;
select * from emp where comm is not null;
max/min/sum/avg,这类涉及到统计的,需要跑mapreduce,耗时比较久
select count(1) from emp where deptno=10;
select max(sal), min(sal), sum(sal), avg(sal) from emp;
group by,这个也是要跑mapreduce
求每个部门的平均工资
出现在select中的字段如果没有出现在聚合函数里,则必须出现在group by里
select deptno, avg(sal) from emp group by deptno;
求每个部门、工作岗位的平均工资
select deptno, job, avg(sal) from emp group by deptno, job;
求每个部门平均工资大于2000的部门
对于分组函数过滤使用having
select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000;
这个也是要跑mapreduce
create table dept(
deptno int,
dname string,
loc string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
LOAD DATA LOCAL INPATH '/Users/dinghui/data/dept.txt' OVERWRITE INTO TABLE dept;
select
empno, ename, sal, e.deptno, dname
from emp e join dept d
on e.deptno = d.deptno;
EXPLAIN select
empno, ename, sal, e.deptno, dname
from emp e join dept d
on e.deptno = d.deptno;
EXPLAIN extended
select
empno, ename, sal, e.deptno, dname
from emp e join dept d
on e.deptno = d.deptno;
外部表创建:加EXTERNAL关键字,通常我们会用location指定外部表存放位置,/external/emp/这个目录不需要我们自己手动创建。例如:
CREATE EXTERNAL TABLE emp_external(
empno int,
ename string,
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/external/emp/';
此时我们如果去mysql看元数据信息,命令select * from TBLS \G;,会有如下关键字,TBL_TYPE: EXTERNAL_TABLE,若该字段是TBL_TYPE: MANAGED_TABLE(则是内部表)。
外部表 VS 内部表
shell临时显示字段名
set hive.cli.print.header=true;
shell 临时显示当前库
set hive.cli.print.current.db=true;
查看hive支持的函数
show functions;
查看该函数的使用方法
desc function upper;
查看该函数的使用方法,且有例子介绍
desc function extended upper;
参考: 慕课网 - Hadoop 系统入门+核心精讲