一、概述
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值會存放到同一個桶