|
|
1
Marco99
7 年前
我创建了配置单元外部表(这通常是我的选择)。你可以坚持你的。
请遵循以下步骤:
-
创建数据库
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\u plain\u表”
./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
-
在testdb上运行select*命令。Employee\u plain\u表
select * from testdb.Employee_plain_table;
这应该显示20条记录。
-
使用insert命令
insert overwrite table testdb.employee select * from employee_plain_table;
这应该运行map reduce作业并将记录插入到Bucked
这将创建5个文件,因为根据的DDL,我们有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
打开每个文件,与原始数据文件进行比较,您将
了解发生了什么。
希望这能澄清您的疑问!
参考:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables
更新:您使用“local”加载,这只是一个复制操作,即它将给定的输入文件从源位置复制到目标位置。“local”中的Load命令是一个副本,“hdfs”中的Load命令是一个移动操作。没有涉及mapreduce,因此没有发生bucketing。
|