您当前的位置: 首页 >  hive

cuiyaonan2000

暂无认证

  • 1浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Buckets On Hive

cuiyaonan2000 发布时间:2021-12-02 17:50:51 ,浏览量:1

序言

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

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

创建分桶

创建的语法如下:

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,然后跟分桶数取余,已决定放入到哪个桶里(或者叫文件中cuiyaonan2000@163.com).

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

hive.enforce.bucketing:true

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

hive.enforce.bucketing:false

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

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

关注
打赏
1638267374
查看更多评论
立即登录/注册

微信扫码登录

0.0713s