我创建了两个表:
1)一个用于分区的分区
2)只有 table
我知道hive中分区和分区的概念 . 但我有点困惑因为我读过 'partition creates directory and bucketing creates files'
. 我同意第一部分,因为我可以在HDFS Hive Warehouse中看到,但我无法在HDFS中看到 ONLY
bucketing表的任何文件,除了我加载到表中的数据文件 . 那么 ONLY
bucketing表的文件在哪里?我能够在分区目录下看到的文件是 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;
我已经读过,当我们创建表时会创建存储桶 . 如果我遗漏了某些内容或出错了,请更正我 . 有人请帮忙吗?
2 回答
我创建了hive外部表(通常是我的选择) . 你可以坚持下去 .
请按以下步骤操作:
这应该显示20条记录 .
这应该运行map reduce作业并将记录插入到bucketed表中 .
这将创建5个文件,因为我们有5个桶,根据employee表的DDL .
打开每个文件,与原始数据文件进行比较,您就会知道发生了什么 .
希望这能澄清您的疑问!参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables
更新:您使用“本地”加载,它只是一个复制操作,即它将给定的输入文件从源位置复制到目标位置 . 来自“local”的加载命令是副本,而来自“hdfs”的加载命令是移动操作 . 没有涉及mapreduce,所以没有发生任何争吵 .
这是因为您必须在插入到bucketed表期间强制执行bucketing或为自己创建存储桶 . 如果要将数据插入存储桶表,则可以使用以下标志 .
这将迫使Hive创建桶 . 您应该能够看到许多文件等于您的桶数(如果您有足够的记录和正确的聚类列分布) .
更新 . 加载命令不会创建任何桶,它只是将数据放入HDFS . 您应该将数据加载到另一个表中,并使用insert overwrite语句将数据从一个表插入另一个表 .