1.什么是Hive?
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。其本质上是将SQL转换为MapReduce程序。主要用来做离线数据分析,比直接用MapReduce开发效率更高。
2.Hive架构
- **UI:**客户端。
- COMPILER: Hive编译器,复制将类SQL语句编译成MapReduce程序。
- METASTORE: Hive元数据的集中存放地(数据文件的元数据)。METASTORE包括两部分:服务和后台数据的储存。
- EXECUTION ENGINE: 执行引擎,负责将编译好的MapReduce程序的job提交到Hadoop的Yarn中运行。
- 客户端提交程序到hive中,hive通过COMPILER判断语法是否存在错误,通过METASTORE检查元数据是否匹配,当这些都没有错误是将会有COMPILER编译成对应的MapRduce模板。
- 由EXECUTION ENGINE将任务job提交到Yarn当中运行对应的MapReduce程序(图中为Hadoop1.x版本,在Hadoop2.x采用的是以Yarn作为资源调度器的MR2/YARN模式)。
- 当Map运行结束时,结果会被储存到HDFS对应的目录中,hive可以直接调取对应的数据。
与Hadoop的关系总结起来就是:Hive利用HDFS储存数据,利用MapReduce查询分析数据
详细流程:
3.为什么使用Hive?
- 直接使用MapReduce处理数据所面临的问题有:人员学习成本太高,MapReduce实现复杂查询逻辑难度太大
- Hive操作接口采用类SQL语法,提供快速开发的能力
- Hive避免了去写MapReduce,减少开发人员的学习成本
- Hive功能扩展很方便
4.Hive与传统数据库的区别。
两者的区别就是数据仓库与数据的区别。Hive面向事务,传统数据库RDMS面向分析。
5.数据类型
6.hive常用语句
- 库/表操作
//查看数据库
show databases;
//创建数据库
create database test;
//创建内部表,并定义分隔符
CREATE TABLE IF NOT EXISTS test.student(
id int,
name string)
row format delimited fields terminated by ',';
//查看表结构
desc student;
//清空表
truncate table student;
//删除表
drop table student;
//删除数据库
drop database test;
//命令行执行HQL语句
hive -e hive语句
hive -f 'hive脚本'
通过vi创建create_table.hql脚本,直接把HQL语句写入脚本中
- 导入数据
从linux系统导入数据:
load data local inpath 'path/to/data' into table student;
从hdfs系统导入:
load data inpath 'path/to/path' into table student;
- 查询操作
总结:
SELECT [ALL|DISTINCT] 字段列表(字段1 别名,....)
FROM 表1 别名, 表2 别名, ....
WHERE 条件 ….
GROUP BY 分组字段 HAVING(组约束条件)
ORDER BY 排序字段1 Asc | Desc, 字段2 Asc|Desc, .....
[CLUSTER BY 字段 | [DISTRIBUTE BY字段] [SORT BY字段]]
LIMIT M,N;
全表查询:
select * from student;
别名修改:通过as关键字定义别名,as可加可不加
select sum(sal) as sal_sum from emp;
通过limit关键字限制查询行数
select * from student limit 5;
通过where关键字限定条件查询
select * from emp where sal>2000 ;
通过distinct关键字去重
单列去重:select distinct deptno from emp;
多列去重:select distinct deptno,job from emp;
数学函数
关系函数
select * from student where id >|<|= 5;
字符串函数
select length|reverse|upper|lower(name) from student;
逻辑函数
select * from student where id > 1 or|and id > 5;
聚合函数
select sum(sal) from emp;//统计所有员工的薪金和
分组/排序/分区函数
//group by分组函数
//查询每个部门的最低工资
select deptno,min(sal) as sal_min from emp group by deptno;
//全局排序order by
//查询员工的信息,并以薪资排序,排序顺序默认为升序asc,如需降序显式指定desc。
select * from emp order by sal desc;
//局部排序sort by,对每个redecer都进行排序,但是reducer之间并未排序,所以对整体来说,并不一定有序。
set mapreduce.job.reduces=3;
select * from emp sort by sal desc;
//分区函数distribute by
//创建表,并以deptno分区,以deptno排序
set mapreduce.job.reduces=3;
create table dept_sal as select * from emp_in distribute by deptno sort by empno desc,sal asc;
//分区函数cluster by,cluster by是distribute by和sort by结合使用的结果。
//但是cluster不能指定升降序,只有默认的升序排序,没有降序。
create table dept_sal as select * from emp_in cluster by deptno ;
- 多表连接查询
Join on只支持等值查询
//内连接join,2个表都存在且条件匹配的数据才输出
select e.ename ,d.deptno,d.loc from emp e join dept d on e.deptno = d.deptno;
select 表1.字段 ,表2.字段 from 表1 join 表2 on 表1.字段 = 表2.字段(连接字段);
//左外连接left join,以左边表为基准,右边符合条件匹配的数据保留,否则为NULL
select e.ename ,d.deptno,d.loc from emp e left join dept d on e.deptno = d.deptno;
//左半连接left semi join,输出满足条件匹配的左表数据
select * from emp e left semi join dept d on e.deptno = d.deptno;
//右外连接right join,以右边表为基准,左边符合条件匹配的数据保留,否则为NULL
select e.ename ,d.deptno,d.loc from emp e right join dept d on e.deptno = d.deptno;
//全外连接full join,所有符合where条件的数据都会被保留,否则为NULL
select e.ename ,d.deptno,d.loc from emp e full join dept d on e.deptno = d.deptno;
//笛卡儿积表现方式为2列数据的点乘运算操作,期间会出现大量无效数据,应尽量避免笛卡尔积现象。
select empno,dname from emp ,dept;
- having条件语句
//类似where条件语句,但是having只用于group by分组的条件语句,而where不能与group by一起使用
select deptno ,min(sal) as sal_min from emp group by deptno hvaing sal_ming >900;
- 子查询
又叫嵌套查询、嵌套子查询,通过多个select语句组合嵌套而成
select m.min_sal,e.ename from (select min(sal) as min_sal from emp) as m join emp e on m.min_sal = e.sal;