Hive分桶表

分桶表

对于每一个表或者分区, Hive可以进一步组织成桶,也就是说分桶是更为细粒度的数据范围划分。Hive会计算桶列的哈希值再以桶的个数取模来计算某条记录属于那个桶。把表(或者分区)组织成桶(Bucket)有两个理由:

1.获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用Map端连接(Map-side join)高效的实现。

2.使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

/*----------------分桶表-------------------*/
create table employee_id_buckets(
    name string,
    employee_id int,
    work_place array,
    gender_age struct,
    skills_score map,
    depart_title map>
)
clustered by (employee_id) into 2 buckets    ----把employee_id设置两个分桶
row format delimited fields terminated by '|'
collection items terminated by ','
map keys terminated by ':';

----设置reduceTask任务为2-----
set map.reduce.tasks=2;
set hive.enforce.bucketing=true;---是否开启分桶

插入数据

insert overwrite table employee_id_buckets select * from employee_id;

随机抽样--整行数据

select * from employee_id_buckets tablesample (bucket 1 out of 2 on rand());

随机抽样--指定列

select * from employee_id_buckets tablesample (bucket 1 out of 2 on employee_id);

随机抽样--百分比

select * from employee_id_buckets tablesample (10 percent);

随机抽样--抽取行数

select * from employee_id_buckets tablesample (10 rows);

分桶表和分区表的区别

从表现形式上:分区表是一个目录,分桶表是文件

从创建语句上:

分区表使用partitioned by 子句指定,以指定字段为伪列,需要指定字段类型

分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数

从数量上:分区表的分区个数可以增长,分桶表一旦指定,不能再增长

从作用上

分区避免全表扫描,根据分区列查询指定目录提高查询速度

分桶保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)。

分桶表数据进行抽样和JOIN时可以提高MR程序效率

你可能感兴趣的:(hive,大数据,hive,大数据)