hive表间的四种优化

hive表间的四种优化

hive表间的四种优化

优化1.小表join 大表 (自动开启mapjoin)

select b.uuid2, b.uuid3 , b.uuid4 , b.uuid5 , b.uuid6 
from smalltable s 
  join bigtable b 
   on b.uuid1 = s.uuid1 ; 

大表:27万的数据 53M 六列
小表 3万条6M 六列

第一步确认mapjoin是开启状态
set.hive.auto.convert.join=true;

join inner join 是可以缓存,left join 不能开启缓存

自动开启的阀值是可以自己设定的 。
第二步
set hive.mapjoin.smalltable.fillesize=25 000 000;
为true时,会开启map local small小表进行了本地的map缓存

a , b 两个表都走 reduce

在这里插入图片描述

hive优化二 大表join大表 空值过滤和转换

由于业务场景不能过滤掉NULL值,此时将NULL转换为随机值,并且需要保证与关联键匹配不上。

select 
     count(n.uuid)
from nullidtable n
left jon bigtable o 
  on nvl(n.uuid1,rand()) = o.uuid1;

hive优化三
分桶概念

create table bigtable_buck1(
uuid1 string
,uuid2 string
,uuid3 string 
,uuid4 string 
,uuid5 string 
,uuid6 string
)
cluster by(uuid1)sorted by (uuid1) into 4 buckets 节点cpu核心总数 
row format delimited fields terminated by ',' ;
load data local inpath '/tmp/hive/buck.csv' into table bigtable_buck1;

hive优化四
group by 数据倾斜和去重统计
当某一个列的值,有值,但是数据倾斜的时候, 采用两次MAP阶段,先把这个值打散,在第二个阶段的时候再合并,再到reduce 再去计算
有数据倾斜的时候进行负载均衡(默认是FALSE),会在原来的基础上多生成一个MR JOB (以前是一个)
set.hive.groupby.skewindata=true;


修改reduce数量
当等于-1时,reduce个数是安需使用的
set mapreduce.job.reduces=-1

修改reduce数量,强制reduce使用指定个数执行任务
set mapreduce.job.reduces=5;
遇到 count(distinct) 只使用一个reduce执行任务

数据的大小

kb? byte ? 23.8410241024 所以这里是 b(byte)字节
存储基本单位的换算

1 bite (比特 binary digits) 就是 0和1 最小的存储单位
但是计算机存储容量基本单位是字节 八个bit为一个字节
1 byte (字节) = 8 bit (比特)
1 kb =1024 byte
1 mb = 1024 kb
一个英文字母为 一个byte 一个中文汉字需要两个byte ,英文标点一个字节,中文标点两个字节,
int类型占用4个字节 。
int 4
char 1
char* 4
float 4
double 8
C类型 32
粗略计算数据的大小:100亿条数据,每条数据为 64字节
如果都是char 类型 1char 占用一个字节,

假如这里需要设置数据类型为 char(128) 一条数据 64 byte

10 000 000 000 * 64 byte /(1024∗1024∗1024)= 596 GB
还是应该是
10 000 000 000 * 128 byte /(1024∗1024∗1024)= 1192 GB

这就表示,存储字符串’abc’,使用char(10),表示存储的字符将占10个字节(包括7个空字符)
使用varchar(10),则表示只占3个字节,10是最大值,当存储的字符小于10时,按照实际的长度存储。
2.char类型的效率比varchar的效率稍高
3.char与varchar的区别
varchar是oracle开发的一个数据类型。
工业标准的varchar可以存储空字符串,oracle的varchar还可以存储NULL值,如果想要有向后兼容的能力建议使用varchar
4.varchar比char节省空间,但是在效率上比char稍差些。既要获得效率即必须牺牲一点空间,这就是设计上的"“以空间换时间”"
varchar虽然比char节省空间,但是一个varchar列经常被修改,而且每次修改的数据长度不同,这会引起“行迁移的现象”,
而这造成的多余的I/O,是数据库设计中尽量避免的,在这种情况下使用char代替varchar会更好些。

大表JOIN大表 采用分桶的思想

https://www.cnblogs.com/bajiaotai/p/15880577.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值