什么是Hive
(1)Hive是基于Hadoop之上的数据仓库
(2)Hives是建立在Hadoop HDFS上的数据库仓库基础架构
(3)Hive可以用来进行数据提取转换加载(ETL)
(4)Hive定义了简单的类似SQL查询语言,称为HQL它允许熟悉SQL的用户查询数据
(5)Hive允许熟悉MapReduce开发者的开发自定义的mapper和reducer来处理内建的mapper和reducer无法完成的复杂的分析工作
(6)Hive是SQL解析引擎,他将SQL语言转移成M/R Job然后在Hadoop执行
(7)Hive的表其实就是HDFS的目录/文件
什么是数据仓库
数据仓库是一个面向主题的、集成的、不可更新的、随时间不变化的数据集合,它用于支持企业或组织的决策分析处理
数据仓库的结构和建立过程
Hive的体系结构
(1)Hive的元数据
hive将元数据存储在数据库中(metastore),支持mysql、derby等
hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等
(2)HQL的执行过程
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行
(3)Hive体系结构
Hive的安装
(1)下载 hive.apache.org/downloads.html
(2)安装
嵌入模式:
元熟悉信息被存储在Hive自带的Derby数据库中
只允许创建一个连接
多用于Demo
本地模式:
元数据信息被存储在MySQL数据库中
MySQL数据库与Hive运行在同一台物理机器上
多用于开发和测试
远程模式:
Hive与Mysql安装在不同的操作系统上
(3) 将hive命令添加到path路径
vi ~/.bash_prifile
source ~/.bash_profile
添加完成后,在任何目录下执行 hive命令,hive会自动添加metastore_db目录,该目录用来保存元信息
(4)hive远程模式的安装
1.将数据库驱动jar包加入到hive的lib目录下
2.进入 hive的 conf目录,进行配置
vi hive-site.xml
3.启动hive
启动成功后, 配置的mysql数据库会创建一些表来保存元信息。(此时元信息表为空,因为还未创建表)
4. 创建表
create table test1(tid int, tname string);
此时表信息会被添加到mysql的元信息表中
(5)Hive的启动方式
CLI(命令行)方式
启动:hive
清屏:Ctrl+L 或者 !clear
查看数据仓库中的表:show tables;
查看数据仓库中内置的函数:show functions;
查看表结构:desc 表名
查看HDFS上的文件: dfs -ls 目录
执行操作系统的命令: !命令
执行HQL语句: select *** from ****
执行SQL的脚本:source SQL文件
进行hive的静默模式(不打印调试信息,只打印结果):hive -S
Web界面方式
端口号:999
启动方式:#hive —service hwi
通过浏览器访问:http://
若报错没有war包,则需要下载源码并打包war包,并修改配置文件再启动。同时需要复制jdk的lib目录下的tools.jar 到hive的lib目录。
远程服务启动方式
端口号:10000
启动方式:hive —service hiveserver
以JDBC或ODBC的程序登录到hive中操作数据时,必须选用远程服务启动方式
Hive的数据类型
(1)基本数据类型
-tinyint/smallint/int/bigint :整数类型
-float/double: 浮点数类型
-boolean:布尔类型
-string:字符串类型
-varchar(20):字符串,最长为20
-char(20):字符串,长度为20
(2)复杂数据类型
-Array:数组类型,由一系列相同数据类型的元素组成
-Map:集合类型,包含key->value键值对
-Struct:结构类型 ,可以包含不同数据类型的元素,这些元素可以通过“点语法”的方式来得到所需要的元素
(3)时间类型
-Date:从Hive0.12.0开始支持
-Timestamp:从Hive0.8.0开始支持
Hive的数据存储
(1)内部表
-与数据库中的Table在概念上是类似的
-每一个Table在Hive中都有一个相应的目录存储数据
-所有的Table数据(不包括External Table)都保存在这个目录中
-删除表时,元数据与数据都会被删除
例:
1.create table t1(tid int,tname string, age int); --默认存储在 '/user/hive/warehouse'
2.指定存储目录:create table t2(tid int,tname string,age int) location'/mytable/hive/t2';
3.指定分隔符:create table t1(tid int,tname string, age int) rowformat delimited fields terminated by ',';
4.使用查询语句创建新表:create table t4 as select * from sample_data;
5.查看t4表的文件:hdfs dfs -cat /user/hive/warehouse/t4/000000_0
6.create table t5
row format delimited fields terminated by ',' as select * fromsample_data;
7.alter table t1 add columns(english int);
8.查看表结构:desc t1;
9.drop table t1
(2)分区表
-Partition对应数据库的Partition列的密集索引
-在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中
例:
1.创建分区表:create table partition_table(sid int,sname string)
partitioned by (gender string)
row format delimited fields terminated by ',';
2.插入数据:insert into table partition_table partition(gender='M')select sid,sname from sample_data where gender=‘M’;
分区表可提高查询效率。
使用explain查询SQL语句的执行计划:
explain select * from sample_data where gender='M';
explain select * from partition_table where gender=‘M';
(3)外部表
-只想已经在HDFS中存在的数据,可以创建Partition
-它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异
-外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,知识与外部数据建立一个链接。当删除一个外部表时,仅删除该链接。
例:
1.创建外部表:create external table external_student(sid int,snamestring,age int)
row format delimited fields terminated by ','
location '/input';
2.查询数据:select * from external_student;
(4)桶表
-桶表时对数据进行哈希取值,然后放到不同文件中
例:
创建桶表:create table bucket_table(sid int,sname string,age int)
clustered by(name) into 5 buckets;
(5)视图
-视图是一种虚表,是一个逻辑概念;可以跨越多张表
-视图建立在已有表的基础上,视图赖以建立的这些表称为基表
-视图可以简化复杂的查询
例:
create view empinfo as
select e.empno,e.ename, e.sal,e.sal*12 annlsal,d.dname from empe,dept d where e.deptno=d.deptno;
Hive的数据导入
1)使用load语句
load data [local] inpath 'filepath' [overwrite]
into table tablename [partition (partcol1=val1,partcol2=val2…)]
例:将/root/data下的所有数据文件导入t3表中,并且覆盖原来的数据
load data local inpath '/root/data/' overwrite into table t3;
将HDFS中 /input/student01.txt 导入到t3
load data inpath '/input/student01.txt' overwrite into table t3;
将数据导入分区表
load data local inpath '/root/data/data1.txt' into tablepartition_table partition(gender=‘M');
(2)使用Sqoop实现数据的导入
需要下载和安装Sqoop
Hive的数据查询
Hive的Fetch Task功能开启后,简单查询将不会进行mapreduce操作。
Fetch Task配置方式有以下3种:
1.set hive.fetch.task.conversion=more;
2.hive --hiveconf hive.fetch.task.conversion=more
(2)过滤和排序
(3)Hive的函数
1.内置函数
-数学函数:round、ceil、floor
-字符函数:lower、upper、length、concat、substr、trim、lpad、rpad
-收集函数:size
-转换函数:cast
-日期函数:to_date、year、month、day、weekofyear、datediff、date_add、date_sub
-条件函数:coalesce、case...when...
例:
select ename, job, sal,
case job when 'PRESIDENT' then sal+1000
when 'MANAGER' then sal+800
else sal+400
end
from emp;
-聚合函数:count、sum、min、max、avg
-表生成函数:explode
(4)Hive的表连接
-等值连接(若连接条件是=)
-不等值连接(不是=)
-外连接
-自连接
(5)Hive子查询
-hive只支持from和where字句中的子查询
Hive的命令分为以下几类:
-进入与退出Hive交互,比如:hive、quit、exit
-参数设置:set、reset
-资源文件管理:add、list、delete
-执行shell命令:!Cmd
-Hdfs文件操作: dfs-ls、dfs-cat
-HiveQL:
-执行外部文件:source FILE、compile’