Rom*_*Die 7 hadoop hive hdfs cloudera hortonworks-data-platform
我创建了两个表:
1)一个用于分区的分区
2)只有分层表
我知道hive中分区和分区的概念.但我有点困惑,因为我已经读过'partition creates directory and bucketing creates files'.我同意第一部分,因为我可以在HDFS Hive Warehouse中看到,但ONLY除了我加载到表中的数据文件之外,我无法在HDFS中看到任何用于bucketing表的文件.那么ONLYbucketing表的文件在哪里?我能够在分区目录下看到的文件是一个喜欢的文件,eg: 00000_0但是这个文件可以用于分区表但是另一个bucketed表呢?
下面是我创建表的代码:
CREATE TABLE Employee(
ID BIGINT,
NAME STRING,
SALARY BIGINT,
COUNTRY STRING
)
CLUSTERED BY(ID) INTO 5 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
Run Code Online (Sandbox Code Playgroud)
负载数据代码如下:
load data local inpath '/home/cloudera/Desktop/SampleData.txt' into table employee;
Run Code Online (Sandbox Code Playgroud)
我已经读过,当我们创建表时会创建存储桶.如果我遗漏了某些内容或出错了,请更正我.有人请帮忙吗?
我创建了hive外部表(通常是我的选择).你可以坚持下去.
请按以下步骤操作:
创建一个数据库
CREATE DATABASE IF NOT EXISTS testdb LOCATION '/hivedb/testdb';
Run Code Online (Sandbox Code Playgroud)创建一个聚簇表(bucketed table)
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';
Run Code Online (Sandbox Code Playgroud)创建一个普通表
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';
Run Code Online (Sandbox Code Playgroud)按照@lake在上一个答案中的建议执行分组
set hive.enforce.bucketing = true;
Run Code Online (Sandbox Code Playgroud)创建一个数据文件('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
Run Code Online (Sandbox Code Playgroud)将数据文件复制到HDFS位置'/ hivedb/testdb/employee_plain_table'
./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
Run Code Online (Sandbox Code Playgroud)在testdb.Employee_plain_table上运行select*命令
select * from testdb.Employee_plain_table;
Run Code Online (Sandbox Code Playgroud)
这应该显示20条记录.
使用insert命令
insert overwrite table testdb.employee select * from employee_plain_table;
Run Code Online (Sandbox Code Playgroud)
这应该运行map reduce作业并将记录插入到bucketed表中.
这将创建5个文件,因为我们有5个桶,根据employee表的DDL.
使用命令验证:
./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
Run Code Online (Sandbox Code Playgroud)打开每个文件,与原始数据文件进行比较,您就会知道发生了什么.
希望这能澄清您的疑问!参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables
更新:您使用"本地"加载,它只是一个复制操作,即它将给定的输入文件从源位置复制到目标位置.来自"local"的加载命令是副本,而来自"hdfs"的加载命令是移动操作.没有涉及mapreduce,所以没有发生任何争吵.
| 归档时间: |
|
| 查看次数: |
1439 次 |
| 最近记录: |