Hive分桶

作者: geekAppke | 来源:发表于2018-12-16 19:10 被阅读9次
分桶:把上传数据,分为不同的文件
    将同一个目录下的数据文件,拆分成多个
    同一目录多个文件
    加快表连接的速度(join)
应用场景:数据抽样(sampling)、map-join

其他情况不建议分桶,小文件很恐怖!
资源调度和分配————最消耗时间

Hive分桶

  1. 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
  2. 对于hive中每一个分区都可以进一步进行分桶。
  3. 列的哈希值/桶的个数来决定每条数据划分在哪个桶中。

开启支持分桶

set hive.enforce.bucketing=true;
默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)
注意:一次作业产生的桶(文件数量)和reduce task个数一致。

往分桶表中加载数据

insert into table bucket_table select columns from tbl;
insert overwrite table bucket_table select columns from tbl;

桶表抽样查询

hive> select * from bucket_table tablesample(bucket 1 out of 4 on columns);

TABLESAMPLE语法:
    TABLESAMPLE(BUCKET x OUT OF y)
    x:表示从哪个桶开始,抽取数据
    y:必须为该表总bucket桶的倍数或因子

当表总bucket数为32时
(1)TABLESAMPLE(BUCKET 3 OUT OF 8),抽取哪些数据?
    32 / 89 = 4抽4个桶
    从3开始,11,19,27 这4个桶的数据
(2)TABLESAMPLE(BUCKET 3 OUT OF 256),抽取哪些数据?
    抽取 32 / 256 = 1/8 ,从第3个桶取1/8的数据

不管是倍数还是因子,桶的个数 / y = 需要的值

建原始表

hive> create table psn31(id int, name string, age int) 
row format delimited fields terminated by ',';

hive> load data local inpath '/root/psn31.data' into table psn21;

创建分桶表

给定指定列

hive> create table psnbucket(id int, name string, age int)
clustered by (age) into 4 buckets
row format delimited fields terminated by ',';

加载数据:
hive> insert into table psnbucket select id, name, age from psn31;
执行map-reduce

抽样
hive> select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);
id     name     age
7      alice     77
3      dog       33

测试数据

原始数据 分桶顺序 分桶号
1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88
3
2
1
0
3
2
1
0
8,scala,88
4,hive,44
7,alice,77
3,dog,33
6,mr,66
2,cat,22
5,hbase,55
1,tom,11
分桶数据

参考资料

Hadoop集群上搭建Hive
Hive建表并加载数据
Hive参数和动态分区

相关文章

  • Hive 1.2.1 分区和分捅

    1. 借鉴 Hive学习笔记——Hive中的分桶Hive分区和分桶(0925)HIVE表索引,分区和分桶的区别 2...

  • Hive 分桶

    Hive 分桶 分桶对于每一个表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分Hive是针对...

  • Hive分桶

    Hive分桶 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。 对于hive中每一个表、分区都可以进一...

  • Hive分桶

    提问:为什么要创建分桶表呢? 我认为有以下两点原因: (1):分桶表是为了在分区表的基础上,进...

  • Hive分桶表

    测试数据 创建分桶表 设置变量,设置分桶为true, 设置reduce数量是分桶的数量个数 加载数据 检查刚刚加载...

  • Hive 分区/分桶

    分区/桶 Hive 分区 Hive的分区方式:由于Hive实际上是数据文件在HDFS存在的目录区分分区字段是虚拟列...

  • Hive 分桶详解

    1分桶 1.1什么是分桶?和分区有什么区别? 分区:Hive在查询数据的时候,一般会扫描整个表的数据,会消耗很多不...

  • hive分桶实践

    A表1亿条记录 B表1亿条记录, A表B表通过id字段关联,直接关联报错,跑不动任务; 现在对A B表分别进行分桶...

  • 案例详解__HIVE中内部表、外部表、分区表和分桶表

    目录一、Hive建表语法二、内部表外部表三、分区表四、分桶表 Hive在建表时可指定内部表、外部表、分区表和分桶表...

  • Hive的分桶详解

    Hive分桶通俗点来说就是将表(或者分区,也就是hdfs上的目录而真正的数据是存储在该目录下的文件)中文件分成几个...

网友评论

    本文标题:Hive分桶

    本文链接:https://www.haomeiwen.com/subject/hwbihqtx.html