hive命令5

hive命令5

1.分桶
hive中的分桶是另一种将数据切分为更小片段的方式,
然而,高效的分区要求采用分区键,并不会导致出现大量的非常小的分区
因此,对于你的分区键有很多的值,但是分区键的每个值都没有多少行时,那么分区
并不是最佳选择,此时分桶很适合这种情形

2.分桶可以让你为每个表的分桶列定义桶的最大数目,hive中的一个分区就是一个目录,
分区键的值存放在实际的分区目录名中,而分区键是表中的一个虚拟列。
然而,在分桶中,每个桶都是一个保存实际数据的文件,这些数据基于一种散列算法进行
分割。分桶并不会为当前表添加一个虚拟列。

3.分桶的优势,最主要的一点就是能够提升多种查询的性能,如果分桶所用的键是非倾斜的,
那么对你的数据将会均衡分布,这一点可以用于实现高效的数据抽样。

4.分桶代码案例
创建customers表,并且将创建的custid列作为一个分桶列,将其分割成11个桶。
create external table customers(
custid int,
fname string,
lname string
)
clustered by (custid) into 11 buckets
location ‘/opt/customers’;

现在,当你向该表插入数据时,Hive将custid用于散列函数,将数据分发到11个桶当中。
对于有些数据类型来说,就意味着哪写含有相同custid值的行将被存放在相同的桶中。

注意:要设置
hive.enforce.bucketing=true
没有这个参数,就需要为表定义与桶的数量相同的映射器。

5.分桶的注意事项
(1)选择唯一值的个数较多的桶键,这样会减小出现倾斜的可能性
(2)采用质数作为桶的编号
(3)如果桶键中的数据时倾斜的,为倾斜的值单独创建桶,这可以通过列表分桶来实现
(4)分桶对于通常连接在一起的事实表来说非常有用
(5)需要连接在一起的表,其桶的数目必须相同,或者一个表的桶数是另一个表的桶数的因子
(6)要仔细选择桶的数目,一个cpu核只会对一个桶进行写入操作,因此对于一个大型集群而言,如果桶的数目很小,则集群的利用严重不足
(7)一旦表建好,桶的数目就不能改变了
(8)仔细选择进行分桶的列,因为散列函数会引发倾斜,字符串散列更有这种倾向,因为通常使用的字符串子集很小。例如,如果桶键含有abc789,abc567,abc123三个值,但是散列算法在计算候选桶时仅仅用到了前3个字符(abc),那么最后这3个值都会在同一个桶中
(9)桶文件的大小至少是1GB
(10)通过设置hive.enforce.bucketing=true实现强制分桶
(11)对于Map端连接,分桶表要比非分桶表的速度更快。在Map端连接中,映射器处理左侧表的某个桶时,知道右侧表中相匹配的行在其对应的桶中,因此只需要检索该桶即可,这只是右侧表中存储的全部数据中的一小部分
(12)分桶也允许你按照一列或多列对每个桶中的数据进行排序,这样就可以把Map端连接转换成排序-合并连接,使速度更快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值