首页 > 其他 > 详细

hive分桶

时间:2019-08-27 15:12:47      阅读:73      评论:0      收藏:0      [点我收藏+]

一、hive分桶

概述

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

适用场景:
    数据抽样( sampling )、map-join

数据抽样:
    数据抽样要保证数据的均匀性,而不是一部分极端的数据,分桶表是对列值取哈希值的方式,能保证数据的均匀分布;


开启支持分桶

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


hive (default)> set hive.enforce.bucketing;  #查看是否开启 hive.enforce.bucketing=false
hive (default)> set hive.enforce.bucketing=true;  #开启分桶
hive (default)> set hive.enforce.bucketing;     hive.enforce.bucketing=true


往分桶表中加载数据语法

insert into table bucket_table select columns from tbl;

insert overwrite table bucket_table select columns from tbl;


分桶抽样语法

桶表 抽样查询
    select * from bucket_table tablesample(bucket 1 out of 4 on columns);


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


例1:
当表总bucket数为32时:
TABLESAMPLE(BUCKET 3 OUT OF 4),抽取哪些数据?

桶总数有32
x=2,从第二个桶开始取数据;
y=4,桶的因子或倍数

要抽取数据:8份(32/4)
2,6,10,14,18,22,26,30
    

例2:
当表总bucket数为32时:
TABLESAMPLE(BUCKET 3 OUT OF 256),抽取哪些数据?

桶总数有32
x=3,从第3个桶开始取数据;
y=256,桶的因子或倍数

要抽取数据:1/8份数据(32/256)
从3号桶取1/8数据


二、hive分桶案例

创建原始数据表并导入数据

hive (default)> CREATE TABLE psn31( id INT, name STRING, age INT)                     
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,‘;
OK
Time taken: 0.838 seconds


[root@hadoop-senior ~]# cat data4 
1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88


hive (default)> load data local inpath ‘/root/data4‘ into table psn31;

hive (default)> select * from psn31;   
OK
psn31.id    psn31.name    psn31.age
1    tom    11
2    cat    22
3    dog    33
4    hive    44
5    hbase    55
6    mr    66
7    alice    77
8    scala    88
Time taken: 0.028 seconds, Fetched: 8 row(s)


创建分桶表并加载数据

hive (default)> CREATE TABLE psnbucket( id INT, name STRING, age INT)
              > CLUSTERED BY (age) INTO 4 BUCKETS 
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,‘;
OK
Time taken: 0.032 seconds


hive (default)> insert into table psnbucket select id, name, age from psn31;


hive (default)> select * from psnbucket;
OK
psnbucket.id    psnbucket.name    psnbucket.age
8    scala    88
4    hive    44
7    alice    77
3    dog    33
6    mr    66
2    cat    22
5    hbase    55
1    tom    11
Time taken: 0.049 seconds, Fetched: 8 row(s)


查看分桶情况

##可见分了四个桶,桶号:1, 2, 3, 4
[root@hadoop-senior modules]# hadoop-2.5.0/bin/hdfs dfs -ls /user/hive/warehouse/psnbucket
Found 4 items
-rw-r--r--   1 root supergroup         21 2019-08-27 14:43 /user/hive/warehouse/psnbucket/000000_0
-rw-r--r--   1 root supergroup         20 2019-08-27 14:43 /user/hive/warehouse/psnbucket/000001_0
-rw-r--r--   1 root supergroup         17 2019-08-27 14:43 /user/hive/warehouse/psnbucket/000002_0
-rw-r--r--   1 root supergroup         20 2019-08-27 14:43 /user/hive/warehouse/psnbucket/000003_0


##查看桶中的数据
[root@hadoop-senior modules]# hadoop-2.5.0/bin/hdfs dfs -text /user/hive/warehouse/psnbucket/000000_0
8,scala,88
4,hive,44

[root@hadoop-senior modules]# hadoop-2.5.0/bin/hdfs dfs -text /user/hive/warehouse/psnbucket/000001_0
7,alice,77
3,dog,33

[root@hadoop-senior modules]# hadoop-2.5.0/bin/hdfs dfs -text /user/hive/warehouse/psnbucket/000002_0
6,mr,66
2,cat,22

[root@hadoop-senior modules]# hadoop-2.5.0/bin/hdfs dfs -text /user/hive/warehouse/psnbucket/000003_0
5,hbase,55
1,tom,11


开始抽样

##抽样第二个桶的数据,可见抽样出来的数据和上面查看的第二个桶的数据一样
hive (default)> select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);
OK
id    name    age
7    alice    77
3    dog    33
Time taken: 0.073 seconds, Fetched: 2 row(s)

hive分桶

原文:https://www.cnblogs.com/weiyiming007/p/11418372.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!