概述:
hive是hadoop家族成员,是一种解析like sql语句的框架,它封装了常用的MapReduce任务,让你像执行sql一样操作存储在HDFS的表。
hive的表分为两种,外部表和内部表。
hive创建内部表时,会将数据移动到数据创库指向的路径;若创建外部表,仅记录数据所在的路径不对表数据的位置做任何的改变。
在删表的时候,内部表的元数据和数据会被一起删除,而外部表只会删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享数据。
hive的内外表,还有一个Partition的分区知识点,用于避免全表扫描,快速检索。
下面是hive的详细总结:
hive是数据仓库
数据库和数据仓库的区别
用途:分析,决策类影响
hive搭建
注意:搭建是按照元数据的存储和管理进行搭建的
搭建方式
1、使用hive自带的内存数据库derby
不用
2、使用单机的MySQL数据库,通过网络来访问元数据
使用较多
3、使用远程元数据服务的方式,实现hive和关系型数据库的解耦
使用较多
hive DDL
创建数据库
create database databaseName
创建表
1、create table tablename(col dateType...) row format dilimited fields terminated by '' collection items terminated by '' map keys terminated by ''| serde(正则)
2、create table tablename as select_statement
数据和表结构都有
3、create table tablename like tablename
只有表结构
内部表和外部表
创建
内部表不需要指定数据存储的路径,直接将数据存储在默认的目录中
外部表需要使用external关键字指定,需要使用location指定存储数据的位置
删除
内部表的数据和元数据都是由hive来管理的,删除的时候全部删除
外部表的数据由hdfs管理,元数据由hive管理,删除的时候只删除元数据,数据不会删除
hive的优化
核心思想
将hive的优化当作时MR去优化
优化策略
1、可以查看sql的执行计划
2、抓取策略
3、本地模式
4、并行模式
5、严格模式(strict nonstrict)
使用严格模式后会禁止一些查询
6、map端聚合
7、join
1、当多表连接的时候尽可能多的使用相同的连接键
2、将小表尽量放在左边
3、map端join(将小表的数据加载到内存中)
手动
/*+ mapjoin(smalltable)*/
自动
默认将坐标的表当作小表
根据文件大小来判断大表还是小表
8、排序
order by
会将所有的数据加载到一个reduce中
sort by
保证每个reduce数据有序
distributed by
保证分区有序
clustered by
等同于sort by + distributed by,但是不能指定排序策略
注意:
推荐使用sort by + distributed by结合使用
9、map和reduce个数的设置
map task的个数是由切片决定的
reduce是设置的
1、数据量
2、数据字段可能产生的key的个数
10、重用jvm
适用场景
小文件过多
task过多
使用
预先s申请一部分task的资源,当任务开始执行的时候,占用资源,不用去频繁申请销毁资源
注意
当整个job执行完成之后,才会释放所有资源,所以task的资源个数需要进行测试
hive的权限
分类
1、基于元数据的权限管理
2、基于sql标准的权限管理
3、基于第三方的权限管理
4、默认的权限管理方式
基于sql标准权限管理(hiveserver2)
概念
用户
使用者
角色
一组权限的集合
public
admin
角色的控制
create role rolename
show roles
show current roles
drop role rolename
权限的分配和回收
grant
revoke
hive的索引
创建
create index index_name on tablename(col) as '索引器' in table tablename(存储索引数据)
注意:
1、hive不会自动创建索引
2、创建索引时,执行 ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;
3、每次新增数据之后都需要重新创建索引
hive的视图
创建
create view view_name as select statement
注意:
1、只能做查询,不能insert或者load数据
2、hive执行迭代视图
3、hive不支持物化视图
4、如果使用orderby,视图的优先级高
hive的运行方式
1、cli
1、提交sql语句
2、跟hdfs交互
3、跟本地文件系统交互
2、脚本
hive -e "sql"
hive -e "sql" >aa.txt
hive -S -e "sql"
hive -f file
hive -i file
在cli中执行source file
3、web ui
hwi
一般不用
hue
4、jdbc
hive的分桶
应用场景
1、数据抽样
2、事务支持
使用
设置允许分桶的参数
注意:分桶表在执行的时候,reduce task的个数跟桶的个数保持一致
tablesample(bucket x out of y)
x:从哪个桶开始抽取数据
y:桶的个数的倍数或者因子,一般是使用因子
hive参数
分类
--hiveconf
类似于在hive-site.xml中配置
System
系统变量
env
环境变量
--hivevar
自定义变量
设置方式
1、在hive-site.xml中设置,是全局有效
2、在hive --hiveconf key=value 当前会话有效
3、进入命令行之后,set key=value 当前会话有效
4、在当前用户的家目录下设置.hiverc的文件,每次进入命令行的时候,都会读取当前文件
注意:
在当前用户的家目录下有一个.hivehistrory,记录所有的历史命令
hive的分区
目的:方便提高检索效率
展现形式:再hdfs目录上创建多级目录
hive分区的分类
静态分区
静态分区的值是人为指定的
动态分区
分区列的值是由记录的某一列值来决定的
设置参数:允许动态分区,默认是是true,动态分区的模式:nostrict或者strict
使用动态分区的时候需要使用insert statement语句
添加分区(静态分区)
alter table tablename add parition(col=val)
修复分区
分区是作为元数据存储在MySQL中的,当hdfs路径中包含多级目录,同时存在分区列的是,可以创建外部表使用,但是分区的元数据没有在MySQL中存储,查不到数据
msck repair table tablename
Hive函数
hive本身自带了很多内嵌函数
字符函数
数值函数
日期函数
复杂类型函数
条件函数
函数的分类
udf
一进一出
udaf
多进一出
udtf
一进多出
自定义函数
1、编写Java代码继承UDF类
2、实现evaluate方法,所有实现的核心逻辑写到此方法中
3、将写好的代码打成jar包
4、将jar包上传到本地linux或者hdfs
5、如果是本地linux,在hive客户端执行add jar path;
create temporary function func_name as 'package+class'
6如果是hdfs,直接创建函数
create function func_name as 'package+class' using 'jar在hdfs上的路径'
DML
增
1、load data local inpath '' overwrite/into table tablename (partition)
2、from ... insert overwrite/into tablename select ...
3、insert into table values()
4、insert into local directory dic.. select-statement
删
想要使用删除和修改必须要经过事务,需要配置事务
限制
1、rollback,commit不支持
2、必须是orc的文件格式
3、表必须被分桶
4、默认事务是不开启的
改
以上。