Hadoop基础(三) :Hive数据库

1.什么是Hive?

  Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。其本质上是将SQL转换为MapReduce程序。主要用来做离线数据分析,比直接用MapReduce开发效率更高。
在这里插入图片描述

2.Hive架构

  • **UI:**客户端。
  • COMPILER: Hive编译器,复制将类SQL语句编译成MapReduce程序。
  • METASTORE: Hive元数据的集中存放地(数据文件的元数据)。METASTORE包括两部分:服务和后台数据的储存。
  • EXECUTION ENGINE: 执行引擎,负责将编译好的MapReduce程序的job提交到Hadoop的Yarn中运行。
    在这里插入图片描述
  1. 客户端提交程序到hive中,hive通过COMPILER判断语法是否存在错误,通过METASTORE检查元数据是否匹配,当这些都没有错误是将会有COMPILER编译成对应的MapRduce模板。
  2. 由EXECUTION ENGINE将任务job提交到Yarn当中运行对应的MapReduce程序(图中为Hadoop1.x版本,在Hadoop2.x采用的是以Yarn作为资源调度器的MR2/YARN模式)。
  3. 当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 别名,....)
	FROM1 别名,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;
	select1.字段 ,2.字段 from1 join2 on1.字段 =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;

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值