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分桶

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