Hive在INSERT OVERWRITE

时间:2016-07-30 01:28:44

标签: hive

我有一个分为年,月,日和小时的表。如果我将以下INSERT OVERWRITE用于特定分区,则会将文件放在适当的目录结构下。此文件包含字符串 abc : -

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

但如果我使用以下语句,Hive会在文件夹" hour = 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为除此之外的任何内容创建文件夹。

3 个答案:

答案 0 :(得分:3)

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

它是添加其他目录的UNION ALL语句。 为什么会困扰你?

你可以做一些DISTRIBUTE BY恶作剧或将减少数量设置为1把它放到一个文件中。

答案 1 :(得分:0)

大家好,我有同样的问题,想过分享。

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

表上的count(*)将给出0条记录,并且msck修复将使用默认属性输出错误。 使用set hive.msck.path.validator = ignore; MSCK不会出错,但会发出消息“Partitions not in metastore”

仅在DogBoneBlues设置上述属性之后 (SET hive.mapred.supports.subdirectories = TRUE; SET mapred.input.dir.recursive = TRUE;)该表返回值。(count(*))

答案 2 :(得分:-1)

你可以使用" union"而不是"联合所有"如果你不关心重复。 "联合"不应该创建子文件夹。