一、概述
1、桶表是对数据进行哈希取值,然后放到不同文件中存储。
2、数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。
3、物理上,每个桶就是表(或分区)目录里的一个文件,一个作业产生的桶(输出文件)和reduce任务个数相同。
4、桶表专门用于抽样查询,是很专业性的,不是日常用来存储数据的表,需要抽样查询时,才创建和使用桶表。
二、创建桶表
这里按照ename来创建桶表,分五个Bucket
hive> create table emp_bucket(
> empno int,
> ename string,
> job string,
> mgr int,
> hiredate string,
> salary float,
> comm float,
> deptno int
> )
> CLUSTERED by (ename) into 5 buckets
> row format delimited fields terminated by ',';
OK
Time taken: 2.856 seconds
三、往桶表中插入数据
特别注意:执行数据插入前,需要设置以下参数
set hive.enforce.bucketing=true;
这里将emp表中的数据插入emp_bucket表
hive> insert into table emp_bucket select * from emp;
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
MapReduce Jobs Launched:
Job 0: Map: 1 Cumulative CPU: 0.67 sec HDFS Read: 1438 HDFS Write: 1313 SUCCESS
Total MapReduce CPU Time Spent: 670 msec
hive> select * from emp_bucket;
OK
7369 SMITH CLERK 7902 1980/12/17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981/2/20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981/2/22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981/4/2 2975.0 NULL 20
7654 MARTIN SALESMAN 7698 1981/9/28 1250.0 1400.0 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.0 NULL 30
7782 CLARK MANAGER 7839 1981/6/9 2450.0 NULL 10
7788 SCOTT ANALYST 7566 1987/4/19 3000.0 NULL 20
7839 KING PRESIDENT NULL 1981/11/17 5000.0 NULL 10
7844 TURNER SALESMAN 7698 1981/9/8 1500.0 0.0 30
四、查看桶表在HDFS中的存放形式
[root@hadoop-server01 ~]# hdfs dfs -ls /user/hive/warehouse/emp_bucket/
-rw-r--r-- 1 root supergroup 92 2018-08-16 20:06 /user/hive/warehouse/emp_bucket/000000_0
-rw-r--r-- 1 root supergroup 189 2018-08-16 20:06 /user/hive/warehouse/emp_bucket/000001_0
-rw-r--r-- 1 root supergroup 378 2018-08-16 20:06 /user/hive/warehouse/emp_bucket/000002_0
-rw-r--r-- 1 root supergroup 282 2018-08-16 20:06 /user/hive/warehouse/emp_bucket/000003_0
-rw-r--r-- 1 root supergroup 372 2018-08-16 20:06 /user/hive/warehouse/emp_bucket/000004_0
可以看出,桶表生成的数据为5各个文件,一个桶表对应一个文件,相同Hash值会存放到同一个桶
转载于:https://blog.51cto.com/2951890/2169947