HIve基础概念

HIve基础概念

1.1. hive基本思想
Hive是基于Hadoop的一个数据仓库工具(离线),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。hive的表本质就是Hadoop的目录/文件,hive默认表存放路径一般都是在你工作目录的hive目录里面,按表名做文件夹分开,如果你有分区表的话,分区值是子文件夹,可以直接在其他的M/Rjob里面直接应用这部分数据
1.2引入原因:
1.2.1对存在HDFS上的文件或者HBASE中的表进行查询,是要手写一堆MapReduce代码
1.2.2对于统计任务,只有董MapReduce的程序员才能搞定
1.2.3耗时耗力
总结:HIve基于一个统一的分析查询层,通过SQL语句的方式对HDFS上的数据进行查询,统计,分析
1.3HIve是什么
HIve是一个SQL解析引擎,将SQL语句翻译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的
HIve中的表示纯逻辑表,只是表的定义等等,即表的元数据,本质就是Hadoop的文件/目录
hive本身不存储数据,他完全依赖HDFS或者MApReduce
HIve中的内容是读多写少,不支持对数据的改写和删除
Hive中没有定义专门的数据格式,有用户指定,需要指定三个属性
–列分隔符 空格 “,” “\t”
–行分隔符 \n
–读取文件数据的方法
2.Hive中的SQL与传统SQL的区别
在这里插入图片描述HQL与传统SQL的区别
1.hive和关系数据库存储文件的系统不同,Hive使用的是Hadoop的HDFS,关系型数据库则使用的是服务器本地的文件系统
2.Hive使用的计算模型是MapReduce,而关系型数据库使用的是自己设计的计算模型
3.关系型数据库都是为实时查询业务而进行设计的,而Hive则是为海量数据做数据挖掘设计的,实时性很差
4.hive很容易扩展自己的存储能力和计算能力,这个是畸形Hadoop的,而关系型数据库在这个方面要比Hive差很多

3.HIve的体系架构
在这里插入图片描述CLI:Hive提供的Cli工具,进行交互式执行SQL;直接与Driver进行交互
JDBC/ODBC:Hive提供JDBC驱动,作为Java的API:JDBC是通过Thift Server来接入,然后发送贵Driver
matestore:元数据,是一个独立的关系型数据库,通过是MySQL,Hive会在其中保存表的模式和其他系统元数据
Driver:驱动模块,通过该模块,对输入进行解析编译,对需求的计算进行优化,然后按照指定的步骤执行(通常启动多个MR任务来执行)
4.hive的内部表和外部表
内部表:
create table 内部表
外部表:
create external table location “HDFS/Path” 外部表(必须是文件)
区别:
1.再导入数据到外部表的时候,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是有他自己来管理,而内部表不一样
2.在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的.(本地的数据不会删除,只是删除HDFS上面的数据)
5.分区表和bucket表
1.partition是辅助查询,缩小查询范围,加快数据的检索速度和数据按照一定的规格和条件进行管理
2.Hive中的bucket
2.1hive中的table可以拆分成partition,table和partition可以通过"cluster by"进一步分成bucket,bucket中的数据可以通过"sort by"排序.(注意与order by 的区别)
比如,根据id 进行分桶的语句
create table orders(id int,name string) clustered by (id) into 4 buckets;
2.2’set hive.enforce.bucketing = true’ 可以自动控制上一轮reduce的数量从而适配bucket的个数,当然,用户也可以自主设置mapred.reduce.tasks去适配bucket个数
2.3bucket的作用
—数据sampling,采样定位倾斜代码
—提示默写查询操作效率,列入mapside join
例子:查看sampling数据
tablesample是抽样语句,基本语法:TABLESAMPLE(bucket x out of y)

hive> select * from student tablesample(bucket 1 out of 32 on id); 2bucket=1y 32bucket=16y
注:y 必须是table总bucket数的倍数或者因子。hive根据y 的大小,决定抽样的比列。比如,table总共分了64份,当y = 32时,抽取(64/32)=2个bucket的数据,当 y = 128时,抽取(64*1/128)= 1/2个bucket的数据。x表示从那个bucket进行抽取,比如,table总的bucket数为32,tablesample(bucket 1 out of 16),表示总共抽取(32/16)= 2 个bucket,分别是第3 和 3+16=19个bucket的数据,或者抽取5和5+16= 21个bucket的数据
理由:3%16= 3 1
19%16 = 3 17
5 %16 = 5
21 %16 = 5
余数相同
6.Hive的优化(重要):
6.1Map优化:
1.如何合并小文件,减少map数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat = true
set mapred.max.split.size = 10000000
set mapred.min.split.size.per.node = 1000000
set mapred.min.split.size.per.rack=100000000
2.如何适当的增加map数
set mapred.map.tasks = 10
3.Map端聚合
hive.map.aggr = true
6.2Reduce优化
调整reduce的个数:
1.设置reduce处理的数据量
hive.exec.reducers.bytes.per.reducer
2.set mapred.reduce.tasks = 10
只有一个reduce的情况
没有group by order by
笛卡尔积
6.3分区查询(partition)
where中的分区条件,会提前生效,不必特意做子查询,直接join和groupby
6.4笛卡尔积
join的时候不加on条件或者无效的on条件,hive只能使用一个reduce完成笛卡尔积
6.5Map join
-/ +MAPJOIN(tablelist)/,必须是小表,不要超过1G,或者50W条记录
6.6Union all /distinct
先做union all 再做join或者groupby 等操作可以有效的减少MR过程,尽管是多个select,最终只有一个MR
6.7Multi-insert & multi-group by
从一份基础表中按照不同的维度,一次组合出不同的数据
比如
from student
insert overwrite table tablename select XX group by K1
insert overwrite table tablename select YY group by K2
6.8Automatic merge
当文件大小比阈值小的时候,hive会启动一个MR进行合并
6.9Multi-Count Distinct
必须设置参数 set hive.groupby.skewindata= true
select id,count(distinct id),count(ip) from table
7.hive 的join优化
7.1— 表 连 接 顺 序
按照JOIN顺序中的最后一个表应该尽量是大表,因为JOIN前一阶段生成的数据会存在于 Reducer的buffer中,通过stream最后面的表,直接从Reducer的buffer中读取已经缓冲的中间 结果数据(这个中间结果数据可能是JOIN顺序中,前面表连接的结果的可以,数据量相对较小,内存开销较小),这样与后面的大表进行连接时,只需要从buffer中读取缓存的key,与大表中指定的key进行连接,速度会更快
7.2使用mapjoin加载小表到内存
使用STREAMTABLE(a)将a表视为大表
7.3where条件放置在join on 的条件后面,这样就不行对结果进行与过滤
8.Hive的优化–并行执行
hive并行执行开启:set hive.exec.parallel = true
并行实行: – 同步执行hive的多个阶段,hive在执行过程,将一个查询转化成一个或者多个阶段。某个特 定的job可能包含众多的阶段,而这些阶段可能并非完全相互依赖的,也就是说可以并行执行 的,这样可能使得整个job的执行时间缩短。
9.hive优化—数据倾斜
1.原因:1>key分布不均匀导致
2>人为的建表疏忽,类型不匹配
3>业务数据特点
2.症状:
1》任务进度长时间维持在99%,查看spark界面,发现只有少量的reduce子任务没有完成
2》查看没有完成的子任务,看到本地读写数据量积累非常大,通常超过10G可以认为发生数据倾斜
3.倾斜度:
1》平均记录超过50W并且最大记录是超过平均记录的4倍
2》最长时长并平均时长超过4分钟,且最大时长超过平均时长的2倍
4.万能方法:
设置hive.groupby.skwindata = true
9.2hive优化—数据倾斜—大小表关联
1.原因:
小表优先放左边,如果两张小表,key相对分散的放左边。
Hive在进行join时,按照join的key进行分发,而在join左边的表的数据会首先读入内存,如果左边表的key相对分 散,读入内存的数据会比较小,join任务执行会比较快;而如果左边的表key比较集中,而这张表的数据量很大, 那么数据倾斜就会比较严重,而如果这张表是小表,则还是应该把这张表放在join的左边
2.思路:
将key相对分散,且相对较小的表放在join的左边
使用map join 让小维度的表先进内存
------------
1.原因:日志中有一部分的userid是空或者是0的情况,导致在用user_id进行hash分桶的时候,会将日志中userid为0或者 空的数据分到一起,导致了过大的斜率。
2.思路:
把空值的可以变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果
方法:
on case when (x.uid = ‘-’ or x.uid = ‘0’ or x.uid is null)
then concat(’-’,rand())
else x.uid
end = f.user_id
9.3Hive 优化-----数据倾斜----大大表关联(思路:业务削减)
如果遇到两个大表互相关联,从业务逻辑出发,过滤掉不相关的数据,比如,两个用户登录的表,可以按照时间过滤,只统计今天登录的用户,这样就会大大减少表的数据量
9.4hive优化----数据倾斜—聚合时存在大量特殊值
1.原因:做count distinct时,该字段存在大量值为NULL或空的记录。
2.思路:count distinct时,将之唯恐的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤掉,在最后结果中加1
如果还有其他计算,需要进行group by ,可以先将值为空的记录单独处理,在和其他计算结果进行union
9.5-----HIve优化----数据倾斜—空间换时间
在这里插入图片描述

10.UDF
UDF函数可以直接应用于select语句,对查询结果做个格式化处理之后,在输出内容。
编写UDF函数需要注意:
1.自定义UDF需要集成org.apache.hadoop.hive.ql.UDF
2.需要实现evaluate函数
3.evaluate函数支持重载
比如:使用UDF实现一个大写函数
在这里插入图片描述
11.Transform
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值