• hive中的桶


    hive中有桶的概念,对于每一个表或者分区,可以进一步组织成桶,说白点,就是更细粒度的数据范围。
    hive采用列值哈希,然后除以桶的个数以求余的方式决定该条记录存放在哪个桶当中。
    使用桶的好处:
    1、获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
    2、使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

    需要特别注意的是:clustered by和sorted by不会影响数据的导入,这意味着,用户必须自己负责数据如何如何导入,包括数据的分桶和排序。
    可以使用'set hive.enforce.bucketing = true'

    可以自动控制上一轮reduce的数量从而适配bucket的个数,

    看个例子

    原始数据

    1	15	xiaohong
    2	16	xiaoming
    3	17	xiaohuang
    3	18	xiaocui
    4	19	xiaoma
    5	21	xiaocai
    6	22	xiaojie
    7	25	xiaoliu
    8	28	xaoqi
    

    先创建一张普通表,再创建一张桶的表。

    create table student(id INT, age INT, name STRING)
    partitioned by(p_date STRING) 
    row format delimited fields terminated by '	';
    
    create table  bucketed_student(id INT, age INT, name STRING)
    partitioned by(stat_date STRING) 
    clustered by(id) sorted by(age) into 2 bucket
    row format delimited fields terminated by '	';

    load数据到普通表,因为直接load到分桶的表是不会分桶,需要insert进行才会根据根据分桶要求进行分桶。

    LOAD DATA LOCAL INPATH '/home//aaa' OVERWRITE INTO table bucketed_student partition(p_date='2016');
     
    set hive.enforce.bucketing = true;
    insert overwrite table bucketed_student partition(p_date='2016') select id,age,name from student where p_date=2016

    查看两表的目录,发现分桶会生成两份数据文件

    hadoop fs -ls /data/hive/warehouse/temp.db/bucketed_student/p_date=2016
    Found 2 items
    -rwxr-xr-x   3 webopa hive         50 2016-11-23 13:53 /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000000_0
    -rwxr-xr-x   3 webopa hive         68 2016-11-23 13:53 /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000001_0

    普通表是一份

    hadoop fs -ls /data/hive/warehouse/temp.db/student/p_date=2016
    Found 1 items
    -rwxrwxrwx   3 webopa hive        117 2016-11-23 11:41 /data/hive/warehouse/temp.db/student/p_date=2016/aaa

    查看下分通表每个文件中的数据。偶数一个文件,基数一个文件。

    hadoop fs -cat /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000000_0
    8	28	xaoqi
    6	22	xiaojie
    4	19	xiaoma
    2	16	xiaoming
    hadoop fs -cat /data/hive/warehouse/temp.db/bucketed_student/p_date=2016/000001_0
    7	25	xiaoliu
    5	21	xiaocai
    3	18	xiaocui
    3	17	xiaohuang
    1	15	xiaohong

     查看sampling数据:

    select * from bucketed_student  tablesample(bucket 1 out of 2 on id); 
    8	28	xaoqi	2016
    6	22	xiaojie	2016
    4	19	xiaoma	2016
    2	16	xiaoming	2016
    

    tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
    y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32时,抽取 (64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽取。例 如,table总bucket数为32,tablesample(bucket 3 out of  16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据

  • 相关阅读:
    python 容器的门道
    Python四种常用容器类型
    python容器类型的协议
    MySQL中的锁(表锁、行锁)
    mysql 的垂直分表和水平分表; 垂直分库和水平分库
    前端鉴权的兄弟们:cookie、session、token、jwt、单点登录
    基于多源异构数据的安全知识图谱的自动构建和应用
    数据库心得
    Hadoop
    [NOIP2015 提高组] 神奇的幻方
  • 原文地址:https://www.cnblogs.com/wujin/p/6093401.html
Copyright © 2020-2023  润新知