如何在pig中强制存储(覆盖)hdfs?

93ze6v8z  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(550)

在开发使用store命令的pig脚本时,我必须删除每次运行的输出目录,否则脚本将停止并提供:

2012-06-19 19:22:49,680 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 6000: Output Location Validation Failed for: 'hdfs://[server]/user/[user]/foo/bar More info to follow:
Output directory hdfs://[server]/user/[user]/foo/bar already exists

因此,我正在搜索一个in-pig解决方案来自动删除目录,如果在调用时目录不存在,它也不会阻塞。
在pig拉丁语参考中,我找到了shell命令调用器fs。不幸的是,每当出现错误时,pig脚本就会中断。所以我不能用

fs -rmr foo/bar

(一)。e。因为如果目录不存在它就会中断。有那么一会儿我想我可以

fs -test -e foo/bar

这是一个测试,不应该打破或我认为。然而,Pig又解释道 test 在不存在的目录上的返回代码作为失败代码并中断。
有一个pig项目的jira票证解决了我的问题,并建议对store命令使用可选参数overwrite或force\ u write。无论如何,我使用pig0.8.1是出于必要,没有这样的参数。

3gtaxfhh

3gtaxfhh1#

最后我在grokbase上找到了解决办法。因为找到解决方案花了太长时间,我将在这里复制并添加到它。
假设您想使用以下语句存储输出

STORE Relation INTO 'foo/bar';

然后,为了删除目录,您可以在脚本的开头调用

rmf foo/bar

否“;”或引用,因为它是shell命令。
我现在无法复制它,但在某个时间点,我收到了一条错误消息(关于丢失的文件),我只能假设rmf干扰了map/reduce。所以我建议将调用放在任何关系声明之前。设置之后,寄存器和默认值应该可以。
例子:

SET mapred.fairscheduler.pool 'inhouse';
REGISTER /usr/lib/pig/contrib/piggybank/java/piggybank.jar;
%default name 'foobar'
rmf foo/bar
Rel = LOAD 'something.tsv';
STORE Rel INTO 'foo/bar';
tp5buhyn

tp5buhyn2#

一旦使用fs命令,有很多方法可以做到这一点。对于一个单独的文件,我在脚本的开头添加了以下内容:

-- Delete file (won't work for output, which will be a directory
-- but will work for a file that gets copied or moved during the
-- the script.)
fs -touchz top_100
rm top_100

对于目录

-- Delete dir
fs -rm -r out

相关问题