我试图通过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;
但它抛出了一个错误,称为“error executing shell command”。当我通过命令行执行相同的shell脚本时,它工作得很好。尝试了if条件的不同语法,但没有成功。如果我们考虑不带if条件的简单shell脚本,它就可以正常工作。
你能帮我解决这个问题吗?
谢谢
3条答案
按热度按时间rlcwz9us1#
你可以通过跑步来解决
bash -c "<script>"
:f87krz0w2#
非常感谢你的帮助@如果vad解决方案只是sh,那么它可以正常工作。据我所知,当前pig在执行param声明时不支持复杂的shell脚本(比如if条件)。在调查期间,我考虑了我朋友提出的解决实际问题的另一种方法。
我不是将“true”或“false”值传递给“$condition”变量,而是传递实际的数据集名称。
修改后的脚本是,
正如我所料,它工作得很好。
doinxwow3#
我不熟悉pig,但我怀疑它和其他程序一样
sh
运行外部shell命令。不是有效的sh语法:the
==
操作符是bash扩展。尝试两边的双引号
$condition
在你的情况下可能需要也可能不需要,但它们通常是必要的,所以养成使用它们的习惯。在unix shell(bash或sh)中,"$condition"
表示“变量的值”condition
“鉴于$condition
意思是“取变量的值condition
,将其拆分为单词,并将每个单词视为一个glob模式”;除非你想让这一切发生,否则就用双引号。您可以阅读dash或posh手册,了解plain支持哪些功能
sh
. 有几种实现sh
周围;短跑是一种常见的运动,虽然不那么时髦,但它非常接近最大的共同点。如果愿意,您可以阅读posix标准,但它的可读性甚至不如手册页。