1.Hive简介
Apache Hive是FaceBook实现并开源出来的,它是一个基于Hadoop的数据仓库工具。Hive 1.x版本默认执行引擎是mapreduce,但是Hive 2.x版本开始支持使用Tez与spark作为执行引擎。
2.数据仓库与数据库
划分层面 | 数据仓库 | 数据库 |
---|---|---|
应用场景 | 通常用于存储历史数据(离线分析),擅长OLAP,更加擅长查询操作,不支持update和delete操作 | 通常存储的是实时(在线)的数据,擅长OLTP,擅长增删改 |
模式 | 读模式(在数据读取的时候,对数据进行校验) | 写模式(在数据写入的时候进行检查数据是否合规) |
代表 | Hive | MySQL |
OLAP:联机分析分析
OLTP:联机事务处理
3.Hive的数据组织形式
1)库
类似MySQL,为了便于管理数据,将不同的业务的数据放在不同的数据库下,与传统的关系型数据库一样
2)表
按表中数据的权限划分:
分类 | 说明 |
---|---|
内部表 | hive自己管理表中的数据,对应一个hdfs 的目录,此目录的权限归hive所有,hive在删除表数据的时候,连同hdfs对应的表数据的目录一并删除 |
外部表 | 外部表数据也是存在hdfs的目录,此时,hive对于hdfs的数据只有使用权限,没有删除权限,表删除的时候只能删除表结构信息(元数据),不会删除表中的数据(hdfs数据不会动) |
按照功能划分:
hive 表中存储的数据存储在hdfs上,存储的数据可能很大,在进行表查询的时候,每次查询都会进行hive大的全表扫描(极大降低查询性能),可以将数据分成多个部分。
分类 | 说明 | 功能 | 表现形式 |
---|---|---|---|
分区表 | 创建分区的时候必须有统一的标准(分区字段),一般情况下,分区字段选的是过滤查询用的比较多的字段。 | 提高查询性能,尽量避免全表扫描 | 相当于在原来的目录下创建子目录(查询的时候只扫描对应分区目录下的所有文件) |
分桶表 | 将原始表进行划分为多个文件(多个桶表),(类似mapreduce中部分区)作用 | 1)提升数据抽样查询的性能 (原始数据数据量很大,样本数据具备代表性,散列的数据,原始数据抽取需要很多次) 2)提升join的性能(相当于桶关联桶,这样就相当于maptask中的map端join,但是解决了大表关联大表的情况) |
每一个分桶表的每一个桶都会对应一个文件,即几个桶,就有几个表文件。 |
注
:分通字段是整型的,那么直接分通字段 % 桶数,否则:分通字段.hash % 桶数
3)视图
hive中的视图只有逻辑视图,没有物化视图,一个视图代表一个查询语句,hive中的视图仅仅相当于SQL查询语句的一个快捷方式。
hive中的视图,查询视图的时候才会执行
。
物理视图:将视图代表的查询语句,执行出来结果
视图的作用:hive中的视图,主要是为了提升hql语句的可读性
4.Hive 中数据存储
1) 默认的Hive原始数据库存储目录:
hdfs://xxx:9000/user/hive/warehouse
该目录可以通过修改hive-site.xml或者修改元数据存储数据库中DBS表中hive数据库存储路径
hive-site.xml中设置属性
hive.metastore.warehouse.dir
2) 存储目录格式
hdfs://xxx:9000/user/hive/warehouse/ 库目录/表目录/文件
- Hive 的元数据
部分 | 描述 |
---|---|
数据库 | DBS表中,存储的是hive中的数据库与hdfs的目录的对应关系,每当hive每创建一个数据库,这个表中会写入一条信息 |
数据表 | TBLS表中,包括DB_ID,Table_Name,表创建时间,表类型(内部表和外部表或虚拟视图)等信息,绑定了表和库的相关信息,每当hive创建一个表,这个表中就会创建一条记录。 |
表字段 | COLUMNS_V2表:CD_ID(表ID),字段名称,字段类型,字段索引(代表字段顺序,从0开始),每当hive表中添加一个字段,这里就会多一条记录 |
注:元数据可以修改,但是要慎重。
hive中所有显示的表结构相关的数据都是来自元数据存储数据库的表中的。
5.Hive 的优缺点
hive的缺点
1)延时性高,只能做离线分析
2)对事务的支持比较弱,只支持行级别的事务
3)不支持delete,update,支持insert但是效率慢
hive的优点:
扩展性好,支持自定义函数
容错性好(hdfs的优点)
6.Hive DDL操作
1)库操作
create database [if not exists] 库名;
show databases; # 查询所有可用数据库
drop database 库名;
show databases like 'test*';# 查看某些库名的数据库
desc database mktest;# 显示的时候是从元数据存储数据库的表中拉取的
desc database extended mktest;# 查看数据库扩展信息
select current_database();# 查看正在使用的库
# 修改数据库名不支持
drop database mktest cascade;# 可以删除非空数据库
drop database mktest2; # 只能能删除空库
2) 表操作
① 建表语句
create [external] table [if not exists] mk(字段名 字段类型 comment '',...)
partitioned by(字段名称,字段类型 comment '')
clustered by (字段名) [sorted by (字段列表 asc|desc)comment '表描述'] into 桶数 buckets
row format by ''
stored as 文件格式
[location ''] # 指定这个表在hdfs中默认存储的位置
注:分区字段一定不能在建表字段中,所以分区字段需要指定类型。分桶字段一定在建表字段中。
sorted by (xxx asc,xxx desc); 指定桶中的数据的排序规则的,桶中排序字段也是表中定义过的
row format 指定行格式化参数,即指定各种分隔符(行分隔符 lines terminated by ‘\n’,列分隔符 fields terminated by ‘\t’,集合中元素的分隔符 )行分隔符一般不设置(默认就是的)
② 存储格式的设置:(stored as 文件格式)
SequenceFile
ORCFile
TextFile(默认)
③ 表信息查看
desc 表名
desc extended 表名 ; //查看表的详细信息
desc formatted 表名;
④ 修改表
修改表名:
直接修改元数据表 TBLS
alter 语句修改
alter table 原表名 rename to 新表名;
修改表的列信息:
# 增加列
alter table 表名 add columns(字段名 字段类型);
# 修改列 --- hive 2中只能从小的类型修改为大的类型,例如int类型可以修改为string类型反过来则不行
alter table xs change name username string;
alter table xs change uid uid string;
修改分区信息----针对分区表
# 添加分区
alter table xs add partition(分区字段=分区值);
# 查看分区别所有分区信息
show partitions 分区表表名;
# 修改分区:(修改分区的存储路径)
# 1.在添加分区时指定存储路径
alter table 表名 add partition(cddi=23) location '/user/hive/warehouse/cd';
# 2.已经添加的分区修改分区路径==>此形式在添加数据时才会修改
alter table 表名 partition(cddi=23) set location '';
# 删除分区
alter table 表名 drop partition(分区字段='值');
清空表:
truncate table 表名;
删除表:
drop table [if not exists] 表名;
其他辅助命令:
show tables in xshuhu;# 某库下所有表
show create table msx;
show functions;# 查看函数列表
# 展示指定分区下面的子分区
show partitions xs partition(city='xx');