创建一个数据库
CREATE DATABASE IF NOT EXISTS testdb LOCATION '/hivedb/testdb';
创建一个分桶表(聚簇表)
CREATE TABLE testdb.Employee(
ID BIGINT,
NAME STRING,
SALARY BIGINT,
COUNTRY STRING
)
CLUSTERED BY(ID) INTO 5 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/hivedb/testdb/employee';
创建一个简单的表格
CREATE TABLE testdb.Employee_plain_table(
ID BIGINT,
NAME STRING,
SALARY BIGINT,
COUNTRY STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/hivedb/testdb/employee_plain_table';
按照之前回答中@lake的建议,强制使用分桶(bucketing)
set hive.enforce.bucketing = true;
创建一个数据文件('data.txt')。我创建了一个包含20个记录的数据文件。
1,AAAAA,1000.00,USA
2,BBBBB,2000.00,CANADA
3,CCCCC,3000.00,MEXICO
4,DDDDD,4000.00,BRAZIL
5,EEEEE,5000.00,ARGENTINA
6,DDDDD,6000.00,CHILE
7,FFFFF,7000.00,BOLIVIA
8,GGGGG,8000.00,VENEZUELA
9,HHHHH,9000.00,PERU
10,IIIII,10000.00,COLOMBIA
11,JJJJJ,11000.00,EQUADOR
12,KKKKK,12000.00,URUGUAY
13,LLLLL,13000.00,PARAGUAY
14,MMMMM,14000.00,GUYANA
15,NNNNN,15000.00,NICARAGUA
16,OOOOO,16000.00,PANAMA
17,PPPPP,17000.00,COSTA RICA
18,QQQQQ,18000.00,HAITI
19,RRRRR,19000.00,DOMINICA
20,SSSSS,20000.00,JAMAICA
将数据文件复制到HDFS位置'/hivedb/testdb/employee_plain_table'
./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
在testdb.Employee_plain_table上运行select *命令。select * from testdb.Employee_plain_table;
这应该展示20条记录。
使用插入命令
insert overwrite table testdb.employee select * from employee_plain_table;
这应该会运行一个Map Reduce作业并将记录插入到分桶表中。
根据员工表的DDL,我们有5个桶,因此会创建5个文件。
使用命令进行验证:
./hadoop fs -ls /hivedb/testdb/employee
Found 5 items
-rwxr-xr-x 1 hduser supergroup 95 2017-10-19 11:04 /hivedb/testdb/employee/000000_0
-rwxr-xr-x 1 hduser supergroup 81 2017-10-19 11:04 /hivedb/testdb/employee/000001_0
-rwxr-xr-x 1 hduser supergroup 90 2017-10-19 11:05 /hivedb/testdb/employee/000002_0
-rwxr-xr-x 1 hduser supergroup 88 2017-10-19 11:05 /hivedb/testdb/employee/000003_0
-rwxr-xr-x 1 hduser supergroup 84 2017-10-19 11:05 /hivedb/testdb/employee/000004_0
更新:您使用了“local”加载,这只是一个复制操作,即将给定的输入文件从源位置复制到目标位置。从“local”加载命令是复制操作,“hdfs”中的命令是移动操作。没有涉及到MapReduce,所以没有进行分桶操作。