我创建了两个表:
1)一个用于分区的分区
2)只有表格
我知道hive中分区和分区的概念。但我有点困惑,因为我读过'partition creates directory and bucketing creates files'
。我同意第一部分,因为我可以在HDFS Hive Warehouse中看到,但除了我加载到表中的数据文件之外,我无法在HDFS中看到ONLY
bucketing表的任何文件。那么ONLY
存储表的文件在哪里?我能够在分区目录下看到的文件是那个像eg: 00000_0
那样的文件,但是这个文件可以用于分区表但是另一个分区表呢?
以下是我创建表格的代码:
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;
加载数据的代码如下:
load data local inpath '/home/cloudera/Desktop/SampleData.txt' into table employee;
我已经读过在我们创建表时会创建存储桶。如果我遗漏了某些内容或出错,请更正我。有人请帮忙吗?
答案 0 :(得分:8)
我创建了hive外部表(通常是我的选择)。你可以坚持下去。
请按以下步骤操作:
创建数据库
private async Task YourAsyncMethod(NavigationMenuItem newNavigationMenu)
{
//call async tasks...
}
创建群集表(分块表)
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';
按照@lake在上一个回答
中的建议执行分组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';
创建数据文件(' data.txt')。我用20创建了一个数据文件 记录。
set hive.enforce.bucketing = true;
将数据文件复制到HDFS位置 ' / hivedb / TESTDB / employee_plain_table'
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
在testdb.Employee_plain_table
上运行select *命令./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
这应显示20条记录。
使用插入命令
select * from testdb.Employee_plain_table;
这应该运行map reduce作业并将记录插入到bucketed中 表
这将创建5个文件,因为我们有5个桶,根据DDL 员工表。
使用以下命令验证:
insert overwrite table testdb.employee select * from employee_plain_table;
打开每个文件,与原始数据文件进行比较,然后你就可以了 了解发生了什么。
希望这能澄清您的疑问! 参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables
更新:您使用了" local",它只是一个复制操作,即它将给定的输入文件从源位置复制到目标位置。从" local"加载命令是一个副本,来自" hdfs"是一个移动操作。没有涉及mapreduce,因此没有发生任何争议。
答案 1 :(得分:4)
这是因为您必须在插入到bucketed表期间强制执行bucketing或为自己创建存储桶。如果要将数据插入存储桶表,可以使用以下标志。
target = "http://www.abs.gov.au/ausstats/meisubs.NSF/log?openagent&5206001_key_aggregates.xls&5206.0&Time%20Series%20Spreadsheet&24FF946FB10A10CDCA258192001DAC4B&0&Jun%202017&06.09.2017&Latest"
dest = 'downloaded_file.xlsx'
download.file(url = target, destfile = dest)
这将迫使Hive创建存储桶。您应该能够看到许多文件等于您的桶数(如果您有足够的记录和正确的聚类列分布)。
更新。加载命令不会创建任何桶,它只是将数据放入HDFS。您应该将数据加载到另一个表中,并使用insert overwrite语句将数据从一个表插入另一个表。