猪脚本中的参数值声明通过shell脚本IF条件

时间:2014-12-15 17:26:08

标签: bash shell apache-pig

我试图通过shell脚本声明其中一个param来执行一个pig脚本。此shell脚本包含IF条件。

%DECLARE dataSet `if [ $condition == true ]; then echo "A"; else echo "B"; fi`;

start = LOAD 'test.txt' USING PigStorage(',');
A = FOREACH start GENERATE $0,$1,$2,$3,$4;
B = FILTER A BY ($0==1);
C = FOREACH $dataSet GENERATE $0,$1,$2,$3,$4;
DUMP C;

但它正在抛出一个错误,因为'错误执行shell命令'。当我通过命令行执行相同的shell脚本时,它工作正常。尝试使用if条件的不同语法但没有成功。 如果我们考虑没有IF条件的简单shell脚本,它可以正常工作。

你能帮我解决这个问题吗?

由于

3 个答案:

答案 0 :(得分:1)

非常感谢你的帮助。 @vad解决方案只有sh才能正常工作。据我所知,当我们进行param声明时,目前PIG不支持复杂的shell脚本(如IF条件)。在此期间 调查时间,我考虑了我的朋友提出的解决实际问题的另一种方法。

而不是传递" true"或"假"值" $ condition"变量,正在传递实际的数据集名称。

修改过的脚本是,

%DECLARE dataSet `echo $condition`; 

--where value for $condition is A or B. 
--earlier it was true or false

start = LOAD 'test.txt' USING PigStorage(',');
A = FOREACH start GENERATE $0,$1,$2,$3,$4;
B = FILTER A BY ($0==1);
C = FOREACH $dataSet GENERATE $0,$1,$2,$3,$4;
DUMP C;

它正如我预期的那样正常工作。

答案 1 :(得分:0)

我不熟悉Pig,但我怀疑它像其他任何程序一样调用sh来运行外部shell命令。

if [ $condition == true ]; then echo "A"; else echo "B"; fi

是无效的sh语法:==运算符是bash扩展名。尝试

if [ "$condition" = true ]; then echo "A"; else echo "B"; fi

$condition中的双引号可能在您的情况下是必要的,但可能不是they are often necessary so get into the habit of using them。在unix shell(bash或sh)中,"$condition"表示“变量condition的值”,而$condition表示“获取变量condition的值,将其拆分为单词并将每个单词视为一个圆形图案“;除非你想要发生所有这些,否则请使用双引号。

您可以阅读dashposh手册,了解普通sh支持哪些功能。 sh周围有几种实现方式;破折号是一个普通的破折号,但它与最大的共同点非常接近。如果您愿意,可以阅读POSIX standard,但它的可读性甚至低于手册页。

答案 2 :(得分:0)

您可以通过运行bash -c "<script>"

来解决
%DECLARE dataSet `bash -c "if [ $condition == true ]; then echo A; else echo B; fi"`;

start = LOAD 'test.txt' USING PigStorage(',');
A = FOREACH start GENERATE $0,$1,$2,$3,$4;
B = FILTER A BY ($0==1);
C = FOREACH $dataSet GENERATE $0,$1,$2,$3,$4;
DUMP C;