如何强制配置单元始终创建一致的文件名,如000000_0?

时间:2018-08-07 08:40:01

标签: amazon-s3 hive

我正在通过配置单元外部表对AWS S3进行插入覆盖操作。 Hive在S3上创建一个输出文件 000000_0 。但是,有时我注意到它创建的文件名为 0000003_0 等其他名称。我总是需要覆盖现有文件,但是文件名不一致,我无法这样做。如何强制Hive始终创建一致的文件名,例如 000000_0 ?下面是一个示例代码,其中tab_content是一个配置单元外部表。

INSERT OVERWRITE TABLE tab_content
PARTITION(datekey)
select * from source

1 个答案:

答案 0 :(得分:0)

最好不要这样做,并修改程序以接受目录中任意数量的文件。 每个reducer(如果只在map上运行,则为mapper)创建自己的文件。这些减速器彼此之间一无所知,它们在创建过程中被命名。文件被标记为000001_0,000002_0。但是,如果尝试次数0失败并且尝试次数1成功,也可以是000001_1。另外,如果表已分区并且末尾没有distribute by partition key,则每个化简器将在每个分区中创建它自己的文件。

您可以强制它在单个最终减速器上运行(例如,如果添加order by子句或设置set mapred.reduce.tasks = 1;,则可以完成此操作)。但是请记住,此解决方案不可扩展,因为太多数据会在单个reducer上引起性能问题。另外,如果尝试0失败并且重新启动并且尝试1成功,将会发生什么?它将创建000001_1,而不是000001_0。