2016-07-30 623 views
1

我在年,月,日和小时分区表。如果我将下面的INSERT OVERWRITE用于特定的分区,它会将文件放置在适当的目录结构下。该文件包含字符串ABC: -Hive在INSERT OVERWRITE的分区目录下创建额外的子文件夹

INSERT OVERWRITE TABLE testtable PARTITION(year = 2017, month = 7, day=29, hour=18) 
SELECT tbl.c1 FROM 
(
select 'abc' as c1 
) as tbl; 

但是,如果使用下面的语句,令人惊讶的蜂房文件夹“小时= 18”下创建三个新的文件夹。

enter image description here

而且里面有这三个子文件夹中的文件。

INSERT OVERWRITE TABLE testtable PARTITION(year = 2017, month = 7, day=29, hour=18) 
SELECT tbl.c1 FROM 
(
select 'abc' as c1 
union ALL 
select 'xyz' as c1 
union ALL 
select 'mno' as c1 
) as tbl; 

当我查询数据时,它显示数据的预期。但为什么它会创建这3个新文件夹?由于分区方案仅适用于年,月,日和小时,我不希望Hive为其他任何内容创建文件夹。

回答

2

实际上它与INSERT OVERWRITE或分区无关。

它是UNION ALL语句,添加额外的目录。 为什么它困扰你?

你可以做一些DISTRIBUTE BY shenanigans或者将减数设置为1来将它放到一个文件中。

+0

可能不是问题是底部分区内的额外文件夹将导致查询错误,除非您已打开子目录搜索 – DogBoneBlues

+1

SET hive.mapred.supports.subdirectories = TRUE; SET mapred.input.dir.recursive = TRUE; – DogBoneBlues

0

嗨,大家好,我有同样的问题,并认为分享。

Union all在表中添加了额外的子文件夹。

表上的计数(*)将给出0个记录,并且msck修复将使用默认属性出错。 使用set hive.msck.path.validator = ignore; MSCK不会错误出来,但将消息“分区不metastore”

只有如上所述通过DogBoneBlues (SET hive.mapred.supports.subdirectories = TRUE提到设置属性之后; SET mapred.input.dir.recursive (count(*))

-1

如果你不关心重复项,你可以使用“union”而不是“union all”。 “联合”不应创建子文件夹。