Hive
Hive(一)
一.hive基础
1.hive产生背景
(1)直接使用mapreduce所面临的问题
1)、人员学习成本太高
2)、项目周期要求太短
3)、MapReduce实现复杂查询逻辑开发难度太大
(2)为什么要使用 Hive:
1)、更友好的接口:操作接口采用类 SQL 的语法,提供快速开发的能力
2)、更低的学习成本:避免了写 MapReduce,减少开发人员的学习成本
3)、更好的扩展性:可自由扩展集群规模而无需重启服务,还支持用户自定义函数
2.Hive含义
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,可以将SQL语句转换成MapReduce任务运行。使不熟悉MapReduce的用户很方便地利用HQL处理和计算HDFS上的结构化的数据,适用于离线的批量数据计算。
Hive依赖于HDFS存储数据,Hive 将HQL转换成mapreduce执行,所以说hive是基于hadoop的一个数据仓库工具,是指就是一款基于HDFS的MapReduce计算框架,对存储在HDFS中的数据进行分析和管理。
3.Hive特点
(1).可扩展:Hive可以自由扩展集群的规模,一般情况下不需要重启服务
(2).延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自定义的函数
(3).容错性:良好的容错性,即使节点出现问题SQL仍可完成执行。
优势:
- 提供了一个简单的优化模型
- HQL类SQL语法,简化MR开发
- 支持在不同的计算框架上运行
- 支持在HDFS和HBase上临时查询数据
- 支持用户自定义函数、格式
- 成熟的JDBC和ODBC驱动程序,用于ETL和BI
- 稳定可靠(真实生产环境)的批处理
- 有庞大活跃的社区
二.Hive架构
hive的体系结构可以分成以下几个部分
1.用户接口
CLI:即Shell命令行(Command Line Interface),采用交互形式使用Hive命令行与Hive进行交互
JDBC/ODBC:是Hive的基于JDBC操作提供的客户端,用户通过这连接至Hive sever服务
Web UI:通过浏览器访问Hive
2.跨语言服务
Thrift是Facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive集成了该服务,
能让不同的编程语言调用Hive的接口。
3.底层的Driver
驱动器Driver,编译器Compiler,优化器Optimizer,执行器Executor,Driver组件完成HQL查询语句从语法分析,语法分析,编译,优化,以及生产逻辑执行计划的生成。生成的逻辑之和星计划存储在HDFS中,并随后又MapReduce调用执行。
Hive的核心是驱动引擎,驱动引擎又四个部分组成:
(1)解释器:将HiveSQL语句转换为抽象语法树(AST)
(2)编译器:是将语法树编译成逻辑执行计划
(3)优化器:优化器是对逻辑执行计划进行优化
(4)执行器:执行器是调用底层的运行框架执行逻辑执行计划
4.元数据存储系统
元数据:存储在Hive中的数据的描述信息,HCatalog:将Hive元数据共享给其他应用程序
Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和 外部表),表的数据所在目录
Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存 储目录不固定。数据库跟着 Hive 走,极度不方便管理。
实际生产一般存储在MySQL中,修改配置文件hive-site.xml
5.执行流程
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数 据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生 一个 MapReduce 任务。
三.Hive数据存储模型
Hive中所有的数据都在存储HDFS中,没有专门的数据存储格式;只需要在创建表的适合告诉hive数据中的列分隔符和行分隔符,hive就可以解析数据
hive中的数据模型:
(1)db:在HDFS中表现为:${hive.metastore.warehouse.dir}目录下的一个文件夹。
(2)table:在HDFS表现为所属db目录下的一个文件夹
(3)external table:与table类似,但其数据存放位置可以在任意位置指定路径
(4)partition:在HDFS中表现为table目录下的子目录
(5)bucket:在HDDFS中表现为同一个表目录下根据hash散列之后的多个文件。
四.数据类型
1.基本数据类型
类型 | 描述 | 示例 |
---|---|---|
boolean | true/false | TRUE |
tinyint | 1字节的有符号整数 | -128~127 1Y |
smallint | 2个字节的有符号整数,-32768~32767 | 1S |
int | 4个字节的带符号整数 | 1 |
bigint | 8字节带符号整数 | 1L |
float | 4字节单精度浮点数 | 1.0 |
double | 8字节双精度浮点数 | 1.0 |
deicimal | 任意精度的带符号小数 | 1.0 |
String | 字符串,变长 | “a”,’b’ |
varchar | 变长字符串 | “a”,’b’ |
char | 固定长度字符串 | “a”,’b’ |
binary | 字节数组 | 无法表示 |
timestamp | 时间戳,纳秒精度 | 122327493795 |
date | 日期 | ‘2018-04-07’ |
2.复杂数据类型
类型 | 描述 | 示例 |
---|---|---|
array | 有序的的同类型的集合 | array(1,2) |
map | key-value,key必须为原始类型,value可以任意类型 | map(‘a’,1,’b’,2) |
struct | 字段集合,类型可以不同 | struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0) |
示例建表
(1)有表数据文件employee.txt如下
Michael|Montreal,Toronto|Male,30|DB:80|Product:DeveloperLead
Will|Montreal|Male,35|Perl:85|Product:Lead,Test:Lead
Shelley|New York|Female,27|Python:80|Test:Lead,COE:Architect
Lucy|Vancouver|Female,57|Sales:89|Sales:Lead
(2)建表employee
create table employee(
name string,
address array<string>,
personaInfo array<string>,
technol map<string,int>,
jobs map<string,string>)
row format delimited
fields terminated by '|' #列分隔符
collection items terminated by ',' #map struct和array的分隔符
map keys terminated by ':' #MAP中的key与value的分隔符
lines terminated by '\n'; #行分隔符
(3)上传表
hdfs dfs -put /root/employee.txt /opt/hive/warehouse/employee/
(4)访问数据
hive> select * from employee;
OK
Michael ["Montreal","Toronto"] ["Male","30"] {
"DB":80} {
"Product":"Developer\u0004Lead"}
Will ["Montreal"] ["Male","35"] {
"Perl":85} {
"Product":"Lead","Test":"Lead"}
Shelley ["New York"] ["Female","27"] {
"Python":80} {
"Test":"Lead","COE":"Architect"}
Lucy ["Vancouver"] ["Female","57"] {
"Sales":89} {
"Sales":"Lead"}
Time taken: 0.037 seconds, Fetched: 4 row(s)
访问列数据
hive> select name,address[0],personaInfo[0],technol["Sales"] from employee;
OK
Michael Montreal Male NULL
Will Montreal Male NULL
Shelley New York Female NULL
Lucy Vancouver Female 89
Michael 100 Montreal NULL
Will 101 Montreal NULL
Steven 102 New York NULL
Lucy 103 Vancouver NULL
Mike 104 Montreal NULL
Shelley 105 New York NULL
Luly 106 Vancouver NULL
Lily 107 Montreal NULL
Shell 108 New York NULL
Mich 109 Vancouver NULL
Dayong 110 Montreal NULL
Sara 111 New York NULL
Roman 112 Vancouver NULL
Christine 113 Montreal NULL
Eman 114 New York NULL
Alex 115 Vancouver NULL
Alan 116 Montreal NULL
Andy 117 New York NULL
Ryan 118 Vancouver NULL
Rome 119 Montreal NULL
Lym 120 New York NULL
Linm 121 Vancouver NULL
Dach 122 Montreal NULL
Ilon 123 New York NULL
Elaine 124 Vancouver NULL
Time taken: 0.292 seconds, Fetched: 29 row(s)
修改表结构
将personinfo改成info struct<gender:string,age:int>
hive> alter table employee change personainfo info struct<gender:string,age:int>
> ;
OK
Time taken: 0.171 seconds
#再次查看
hive> select * from employee;
OK
Michael ["Montreal","Toronto"] {
"gender":"Male","age":30} {
"DB":80} {
"Product":"Developer\u0004Lead"}
Will ["Montreal"] {
"gender":"Male","age":35} {
"Perl":85} {
"Product":