我试图通过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脚本,它可以正常工作。
你能帮我解决这个问题吗?
由于
答案 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
的值,将其拆分为单词并将每个单词视为一个圆形图案“;除非你想要发生所有这些,否则请使用双引号。
您可以阅读dash或posh手册,了解普通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;