amazon-s3 - 如何强制 hive 始终创建一致的文件名,如 000000_0?
问题描述
我正在通过配置单元外部表到 AWS S3 上执行插入覆盖操作。Hive 在 S3 上创建一个输出文件000000_0。但是有时我注意到它会创建具有其他名称的文件,例如0000003_0等。我总是需要覆盖现有文件,但文件名不一致,我无法这样做。如何强制 hive 始终创建一致的文件名,如000000_0?下面是我的代码的示例,tab_content
hive 外部表在哪里。
INSERT OVERWRITE TABLE tab_content
PARTITION(datekey)
select * from source
解决方案
最好不要这样做并修改您的程序以接受目录中的任意数量的文件。每个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。
推荐阅读
- excel - 如何使用 Excel vba 将分布在多行中的数据移动到单行?
- docusignapi - 一个 DocuSign 嵌入式标志中的多个登录
- bash - 根据一个值对 12 行的组进行排序
- google-sheets - 谷歌表格过滤大型数据集
- visual-studio-code - 如何在 VSCode 中全局搜索制表符?
- javascript - 如何推送到嵌套在对象中的数组?
- android - 如何在android studio中做智能动画
- c# - 使用foreach循环时重复的Json项目
- ios - Swift/xcode:在标签栏点击时重新加载视图(但不是在按下时)
- python - 我可以在 python 中为语言检测 API 使用多种语言吗?