我有一个分为年,月,日和小时的表。如果我将以下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"下惊奇地创建三个新文件夹。
这三个子文件夹中的每一个都有一个文件。
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为除此之外的任何内容创建文件夹。
答案 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"而不是"联合所有"如果你不关心重复。 "联合"不应该创建子文件夹。