如何在Pig中强制STORE(覆盖)到HDFS?

时间:2012-06-19 22:28:48

标签: apache-pig hdfs

在开发使用 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 Latin Reference中,我找到了shell命令调用程序 fs 。不幸的是,只要出现任何错误,Pig脚本就会中断。所以我不能用

fs -rmr foo/bar

(即删除递归),因为如果目录不存在则会中断。有那么一刻我以为我可以用

fs -test -e foo/bar

这是一个测试,不应该破坏或所以我想。但是,Pig再次将test在不存在的目录上的返回码解释为失败代码并中断。

Pig项目有JIRA ticket解决我的问题,并为 STORE 建议可选参数 OVERWRITE FORCE_WRITE 命令。无论如何,我正在使用Pig 0.8.1,并且没有这样的参数。

2 个答案:

答案 0 :(得分:41)

最后我在grokbase找到了一个解决方案。由于找到解决方案花了太长时间,我会在这里重现它并添加它。

假设您要使用语句

存储输出
STORE Relation INTO 'foo/bar';

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

rmf foo/bar

不“;”或者是引用,因为它是一个shell命令。

我现在无法重现它,但在某些时候我收到了一条错误消息(关于丢失文件的内容),我只能假设 rmf 干扰了map / reduce。所以我建议在任何关系声明之前发出呼叫。在SET之后,REGISTERs和默认值应该没问题。

示例:

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';

答案 1 :(得分:2)

使用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
相关问题