Hive-桶排序

1、概念

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

分桶是将数据集分解成更容易管理的若干部分的另一个技术。

分区针对的是数据的存储路径;分桶针对的是数据文件。

2、案例操作

设置强制分桶和reduces任务数为默认

hive (default)> set hive.enforce.bucketing=true;
hive (default)> set mapreduce.job.reduces=-1;

创建分桶表

create table stu_buck(id int, name string)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';

数据通过子查询的方式导入

//先建一个普通的表
create table stu(id int, name string)
row format delimited fields terminated by '\t';
//向这个表中导入数据
load data local inpath '/opt/module/datas/student.txt' into table stu;

//数据通过子查询的方式导入
insert into table stu_buck
select id, name from stu;

3、分桶规则

Hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中.

4、分桶抽样查询

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive可以通过对表进行抽样来满足这个需求。

查询表stu_buck中的数据:

hive (default)> select * from stu_buck tablesample(bucket 1 out of 4 on id);

tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)

其中y决定抽样比例,x决定从那个桶开始抽取

y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了4份,当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8=)1/2个bucket的数据。

x表示从哪个bucket开始抽取,如果需要取多个分区,以后的分区号为当前分区号加上y。例如,table总bucket数为4,tablesample(bucket 1 out of 2),表示总共抽取(4/2=)2个bucket的数据,抽取第1(x)个和第3(x+y)个bucket的数据。

注意:x的值必须小于等于y的值,否则

FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck

### Hive 中桶表的概念及用法 #### 什么是桶表? 在 Hive 中,桶表是一种用于提高查询性能的技术。它通过对数据进行哈希布并存储到不同的文件夹(即“桶”)中来实现更高效的查询操作[^1]。这种技术特别适用于大规模布式环境下的数据析。 #### 创建桶表 创建桶表时需要指定 `CLUSTERED BY` 和 `SORTED BY` 子句。其中: - **CLUSTERED BY** 表示按照哪些字段对数据进行桶。 - **SORTED BY** 则表示在每个桶内如何对数据排序。 下面是一个典型的创建桶表的例子: ```sql CREATE TABLE my_partitioned_bucketed_table ( col1 INT, col2 STRING ) PARTITIONED BY (dt STRING, country STRING) -- 区字段 CLUSTERED BY (col1) INTO 3 BUCKETS -- 按照 col1 进行桶,为 3 个桶 SORTED BY (col2); -- 在每个桶内按 col2 排序 ``` 上述语句会创建一张区和桶相结合的表。需要注意的是,在实际使用前还需要设置一些参数以启用桶功能[^4]。 #### 启用桶功能 为了使桶生效,需调整以下配置项: ```sql SET hive.enforce.bucketing = true; ``` 此选项强制启用了基于 DDL 的桶机制,从而确保插入数据时能够自动配至相应的桶中[^3]。 #### 数据加载与验证 向桶表插入数据通常采用如下方式完成: ```sql INSERT OVERWRITE TABLE my_partitioned_bucketed_table PARTITION(dt='2023-01-01', country='US') SELECT * FROM source_table WHERE dt='2023-01-01' AND country='US'; ``` 完成后可以通过查看底层 HDFS 文件结构确认是否成功生成多个子目录作为不同桶的结果集。 #### 查询优化 利用 explain 命令可以帮助理解 SQL 执行过程中涉及的具体物理计划细节。例如运行以下命令即可获取相应信息: ```sql EXPLAIN SELECT COUNT(*) FROM my_partitioned_bucketed_table WHERE dt='2023-01-01' AND country='US'; ``` 这有助于析是否有潜在瓶颈存在以及评估整体效率提升情况[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongfeicao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值