Hive之bucket表使用场景

本文详细介绍了Hive中BucketTable的使用方法,包括如何通过CLUSTERED BY子句创建BucketTable,以及如何设置参数以确保数据均匀分布于多个文件中。通过示例展示了在大量数据处理场景下,BucketTable如何提高MapReduce任务的并行度,从而加速数据处理速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:https://www.cnblogs.com/duanxingxing/p/5156951.html

 

前言

bucket table(桶表)是对数据进行哈希取值,然后放到不同文件中存储;

 

应用场景

当数据量比较大,我们需要更快的完成任务,多个map和reduce进程是唯一的选择。
但是如果输入文件是一个的话,map任务只能启动一个。
此时bucket table是个很好的选择,通过指定CLUSTERED的字段,将文件通过hash打散成多个小文件。

 

create table test
(id int,
 name string
)
CLUSTERED BY(id) SORTED BY(name) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘/t’;

 

 

执行insert前不要忘记设置

set hive.enforce.bucketing = true;

强制采用多个reduce进行输出

 

hive> INSERT OVERWRITE TABLE test select * from test09;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 32
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapred.reduce.tasks=<number>
Starting Job = job_201103070826_0018, Tracking URL = http://hadoop00:50030/jobdetails.jsp?jobid=job_201103070826_0018 
Kill Command = /home/hjl/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=hadoop00:9001 -kill job_201103070826_0018
2011-03-08 11:34:23,055 Stage-1 map = 0%,  reduce = 0%
2011-03-08 11:34:27,084 Stage-1 map = 6%,  reduce = 0%
*************************************************
Ended Job = job_201103070826_0018
Loading data to table test
5 Rows loaded to test
OK
Time taken: 175.036 seconds

 

 

hive的sunwg_test11文件夹下面出现了32个文件,而不是一个文件

 

[hadoop@hadoop00 ~]$ hadoop fs -ls /ticketdev/test
Found 32 items
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000000_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000001_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000002_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000003_0
-rw-r–r–   3 ticketdev hadoop          8 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000004_0
-rw-r–r–   3 ticketdev hadoop          9 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000005_0
-rw-r–r–   3 ticketdev hadoop          8 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000006_0
-rw-r–r–   3 ticketdev hadoop          9 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000007_0
-rw-r–r–   3 ticketdev hadoop          9 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000008_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000009_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000010_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000011_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000012_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:20 /ticketdev/test/attempt_201103070826_0018_r_000013_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000014_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000015_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000016_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000017_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000018_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000019_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000020_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000021_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000022_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000023_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000024_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000025_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000026_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000027_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000028_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000029_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000030_0
-rw-r–r–   3 ticketdev hadoop          0 2011-03-08 11:21 /ticketdev/test/attempt_201103070826_0018_r_000031_0

 

 

文件被打散后,可以启动多个mapreduce task
当执行一些操作的时候,你会发现系统启动了32个map任务

### Hive 数据抽样方法及相关关键字 Hive 提供了多种数据抽样的方法,这些方法可以帮助用户高效地获取部分数据用于分析或调试。以下是常见的几种抽样方法及其相关的关键字和语法: #### 1. **基于百分比的块抽样** 通过 `TABLESAMPLE` 函数可以根据数据量的比例来抽取样本。此方法适用于大规模数据集,并且其抽样粒度取决于 HDFS 的块大小。 - **语法**: ```sql SELECT * FROM table_name TABLESAMPLE (n PERCENT); ``` 这里的 `n` 示要抽取的数据占总数据量的百分比[^2]。 - **注意事项**: - 抽样操作无法与 `WHERE` 子句一起使用。 - 不支持子查询。 - 如果抽样失败,则 MapReduce 作业会读取整张作为输入[^5]。 #### 2. **基于固定大小的块抽样** 除了按照百分比抽样外,还可以指定固定的块大小进行抽样。 - **语法**: ```sql SELECT * FROM table_name TABLESAMPLE (n M); ``` 此处的 `n` 是指每个 map 任务所处理的数据块大小(单位为 MB)。这种方法适合于需要控制具体抽样规模的情况[^3]。 #### 3. **基于行数的抽样** 对于某些场景下需要精确控制返回的记录数目时,可采用按照行数的方式来进行抽样。 - **语法**: ```sql SELECT * FROM table_name TABLESAMPLE (n ROWS); ``` 参数 `n` 定义了每个 mapper 需要提取的行数。需要注意的是,最终的结果可能超过预期的数量,因为它是针对每一个 Mapper 来独立计算的。 #### 4. **随机抽样** 当希望获得完全无偏倚的小型数据集合时,可以利用随机函数配合 `LIMIT` 实现简单的随机采样。 - **语法**: ```sql SELECT * FROM table_name ORDER BY RAND() LIMIT n; ``` 上述命令能够从目标格中选取前 N 条经过随机排序后的记录。 #### 5. **桶抽样** 如果预先定义好了分桶结构的话,那么可以直接借助 CLUSTERED BY 和 BUCKET 关键词完成更加精细级别的分区访问需求。 - **语法**: ```sql TABLESAMPLE (BUCKET x OUT OF y ON colname); ``` 其中参数解释如下: - `x`: 所需的具体某几个桶编号; - `y`: 总共存在的全部桶数量; - `colname`: 被用来决定如何分配至各个不同桶内的列名[^1]。 --- ### 示例代码展示 下面给出一段综合运用以上技术的实际案例演示程序片段: ```sql -- 基础创建语句 CREATE TABLE IF NOT EXISTS sample_data ( id INT, value STRING ); -- 插入模拟测试数据... INSERT INTO sample_data VALUES (1,'A'),(2,'B'); -- 使用百分比方式进行抽样 SELECT * FROM sample_data TABLESAMPLE (50 PERCENT); -- 或者依据特定行数执行抽样动作 SELECT * FROM sample_data TABLESAMPLE (1 ROWS); -- 对应随机挑选若干条目出来查看效果 SELECT * FROM sample_data ORDER BY RAND() LIMIT 3; -- 若存在预设好的桶状布局则尝试调用之 SELECT * FROM clustered_table TABLESAMPLE(BUCKET 1 OUT OF 3 ON bucket_column); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值