Buckets On Hive

Buckets On Hive,第1张

Buckets On Hive 序言

分区与分桶都是为了提升Hive的查询效率.两者也可以同时存在.也可以独立存在.具体可以根据自己的业务情况进行选择,创建不同类型的表.

  1. 分区是根据数据某一个字段新建一个目录.以增加相同数据的查询效率.
  2. 分桶是根据数据的某一个字段,在分区或者根目录下创建一个文件,多少个文件就是分桶数.同样可以提升单表查询的效率,另外如果是关联查询,则也会提升关联查询的效率.因为根据关联字段查找对应的文件就行了[email protected]

创建分桶

创建的语法如下:

CREATE [EXTERNAL] TABLE 
    (  [,   ...])]
    [PARTITIonED BY ...] 
    CLUSTERED BY () 
        [SORTED BY ( [ASC|DESC] [,  [ASC|DESC]...])] 
        
        INTO  BUCKETS  
        
    [ROW FORMAT ] 
    [STORED AS TEXTFILE|ORC|CSVFILE]
    [LOCATION '']    
    [TBLPROPERTIES (''='', ...)];

举例:

-- sorted by 桶内的数据排序,可以有多个
-- clustered by 根据哪一个字段进行分桶
-- Distribute by 如果分桶跟排序的字段不一样则使用它来分桶
-- 分桶只能是一个字段.
create table student(id int,name string,sex int)
clustered by(id) 
sorted by(id DESC)
into 4 buckets
row format delimited
fields terminated by ',';
查看分桶信息
desc formatted 表名


相关配置

hive-site.xml

#让hive强制分桶,自动按照分桶表的bucket进行分桶 推荐使用
hive.enforce.bucketing : true;


#手动指定reduce数量,reduce数量也就是分桶数量,在没有设置分桶数量的时候默认的值
mapreduce.job.reduces : num;



#注意
hive.enforce.bucketing为true时,reduce要设为-1;
hive.enforce.bucketing为false时,reduce要设为和分桶数一致;
如果bucketing为 true,reduce又设成大于1的输,会执行两个job。

Insert Data

分桶的实质就是对 分桶字段做了hash,然后跟分桶数取余,已决定放入到哪个桶里(或者叫文件中[email protected]).

所以说如果原有数据没有按key hash ,需要在插入分桶的时候hash.同理通过load添加的数据是无法进行分桶的,因为没有进行key hash以及取余

hive.enforce.bucketing:true

在这种情况下我们可以直接使用hive所支持的insert方式进行数据插入

hive.enforce.bucketing:false

即设置了mapreduce.job.reduces:数字时.则要求hive所支持的insert后的select 中加入

增加增加CLUSTER BY 语句.因为插入的数据我们需要决定放入到哪个桶中.

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5638620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存