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会更好些。