目录(hive)
本质(是什么)
本质:将HQL、SQL转换成MapReduce程序
hive处理的数据 存储在HDFS上
hive分析数据的底层原理是mapReduce
hive执行程勋运行在yarn上
作用(干什么)
可以将海量结构化的数据文件映射为一张表,并提供类sql查询功能
常用于数据分析
架构(有什么)
或者看图:
如图:hive的角色:client、driver、metastore三部分
1、client用户接口
CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)(弃用 )
2、driver驱动器
a、SQL parser 解析器:将sql字符串转换成抽象语法书树ast
b、physical plan 将ast编译成逻辑执行计划
c、query optimizer 优化器对逻辑执行计划进行优化
d、execution执行器:把逻辑执行计划装换成可以运行的物理计划。(对hive来讲就是:mr/spark)
3、metastore元数据
包括:表名、表所属的数据库、表的拥有者、列/分区字段、表的类型(内部、外部表)、表的数据所在目录等。
优缺点
优点
- 开发容易、快:采用类sql语法;
- 开发成本低:避免了写MapReduce
- 适合处理大数据:适合应用在延迟性比较大的、时效性低的场景,
- 比较灵活:支持自定义函数,用户可以可以根据自己的需求实现自己的函数
缺点
- HQL表达能力有限:迭代式算法无法实现、数据挖掘方面不擅长
- 效率低:生成MapReduce作业(比较慢)、调优比较难(颗粒粗)
流程(怎么运作)
hive的知识比较散,底层运行的MapReduce作业。流程不讲述。。。
知识大致分类为:DML(操作数据)、DDL(操作元数据、表。。。。)
DML
1、增(4种方式)
- load data local inpath overwrite/into table tablename (partition)
- from …insert overwrite/into table tablename select …
- insert into table values()
- insert into local directory dic… select-statement
2、删改(需要配置事务)
配置事务有限制:
rollback、commit不支持
必须是orc的文件格式
表必须被分桶
默认事务是不开启的
DDL
DDL内容主要分为:创建数据库、创建表(内部、外部表)、分区、分桶、视图、索引、函数,共7部分梳理
创建数据库
create database 数据库名称
创建表
1、表的数据类型
2、建表语句
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(只有表结构)
hive的分区
作用:方便提高检索效率
展现形式:在hdfs目录上展示多级目录
分区的分类:静态(认为指定)、动态分区(由记录的某一列决定,默认使用动态分区true,需要使用insert statement)
分区的操作
创建分区
create table dept_partition(deptno int , dname string,loc string)
partitioned by (month string)//分区
row format delimited fields terminated by '\t';
添加分区(静态分区)
alter table tablename add parition(col=val)只适用于静态分区
删除分区
alter table tablename add parition(col = val)只适用于静态分区
修复分区
分区是作为元数据存储在MySQL中的,当hdfs路径中包含多级目录,同时存在分区列的是,
可以创建外部表使用,但是分区的元数据没有在MySQL中存储,查不到数据
msck repair table tablename
hive的分桶
应用场景
1、数据抽样
2、事务支持
分桶原则
取其中某一列的值,将值取hash值,再将hash值 % 桶的个数 =>取模
使用
设置允许分桶的参数
实现方式
创建表的时候指定 clustered by tablename(col) into number buckets
注意:分桶表在执行的时候,reduce task的个数跟桶的个数保持一致
抽样查询
tablesample(bucket x out of y)
x:从哪个桶开始抽取数据
y:桶的个数的倍数或者因子,一般是使用因子
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函数
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上的路径'
常用(必会)
1、hive的基本操作
启动hive: bin/hive
查看数据库: show databases
打开默认数据库: use defsult
显示数据库的表: show tables
创建一张表:create table student (id int , name string)
显示tablename的描述结构:desc tablename
插入数据: insert into student (1001,’小明‘)
查询表中数据: select * from table
退出hive : quit
常见问题(必知)
1、数据库和数据仓库有什么区别?
- 数据库用于支撑业务系统的交互查询;hive用于离线业务插叙
- 数据库的数据是维持更新;hive会把历史数据全部保留下来,形成一个时间拉链数据
- 数据库存储的是单一系统的数据;hive是将多种数据源的数据规整到一起
2、hive数据的存储位置
因为hive是建立在Hadoop之上的,数据是存在hdfs上的
3、内部表和外部表的区别
创建
内部表不需要指定数据存储的路径,直接将数据存储在默认的目录中
外部表需要使用external关键字指定,需要使用location指定存储数据的位置
删除
内部表的数据和元数据都是由hive来管理的,删除的时候全部删除
外部表的数据由hdfs管理,元数据由hive管理,删除的时候只删除元数据,数据不会删除
4、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的资源个数需要进行测试
异议
有差错或者需要补充的地方,还望大家评论指出,并详细论证,相互学习,共同进步哈!