首页 > 解决方案 > 如何强制 hive 始终创建一致的文件名,如 000000_0?

问题描述

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

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

标签: amazon-s3hive

解决方案


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

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


推荐阅读