2013-04-26 108 views
0

我想在我的猪脚本通过一个过滤器语句中使用参数替代空白字符

对于我试图

exec -param flt='a1==1 AND a2=2' filterscript.pig 

但可悲的是它抛出一个异常消息

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 101: Local file 'AND' does not exist. 

猪版 - 0.9.2

我已经试过flt='\'a1==1 AND a2=2\''flt="a1==1 AND a2==2"由apache论坛中的pig用户建议以及在SO中看到类似的帖子。

任何帮助将不胜感激

回答

1

我觉得你使用过,因为它是作为条件的参数。如果是这样你会得到这样的错误。相反,您可以将它们作为单独的参数来传递,并在猪脚本中形成条件字符串。

exec -p p1=1 -p p2=2 filterscript.pig 

在您的filterscript.pig脚本中,您可以在条件子句中使用这些参数值。例如

a1==$p1 AND a2=$p2 
+0

感谢您的答复。是的,我知道。看到一些有趣的东西http://stackoverflow.com/questions/12501537/how-can-i-pass-command-line-parameters-with-whitespace-to-an-apache-pig-script,那就是为什么要这样。针对这些问题提出了许多JIRA问题,并且所有问题都已关闭。据他们说,他们支持这种解释方式。 – abhi 2013-04-26 08:44:45

+0

谢谢。那很有意思。所以我认为你应该使用-param“flt ='a1 == 1 AND a2 = 2'”。它对你有用吗? – Rags 2013-04-26 08:59:32

+0

耶试过...不为我工作 – abhi 2013-04-26 09:00:51

1

如果你运行你的脚本繁重的外壳外,你可以做以下内容:

pig -param flt="a1\=\=1 AND a2\=\=2" -f filterscript.pig 

其中filterscript.pig是这样的:

A = load ... 
... 
B = filter A by $flt; 
... 

注意,'='是也逃脱了,否则过滤条件不会被评估为布尔值。

如果您想在使用exec, 尝试使用grunt shell中的过滤器替换,那么您将遇到空白问题。由于转义空白字符不工作,作为一种解决方法,您可以创建一个parameter file

cat params.txt 
flt="a1\=\=1 AND a2\=\=2" 

然后问题:

exec -param_file params.txt filterscript.pig 

注:我用的猪0.12

+0

感谢您的答复。我已经从grunt外壳尝试过了,它显示'ERROR 2999:意外的内部错误。在命令行遇到意外的参数 - 请检查命令行。我已经在调试模式下运行它,输出替代文件'f = filter p by a1;',这意味着如果我只是通过'flt =“a1 \ = \ = 1”',它就能够替代直到a1 – abhi 2013-04-26 10:33:03

+0

,那么替换后的文件看起来像'f = filter a by a1 == 1' – abhi 2013-04-26 10:36:11

+0

您可以发布您执行的命令吗?我刚刚检查了版本0.9.2,它的工作原理。 – 2013-04-26 10:51:50