param值

bxpogfeg  于 2021-06-25  发布在  Pig
关注(0)|答案(3)|浏览(424)

我试图通过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脚本,它就可以正常工作。
你能帮我解决这个问题吗?
谢谢

rlcwz9us

rlcwz9us1#

你可以通过跑步来解决 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;
f87krz0w

f87krz0w2#

非常感谢你的帮助@如果vad解决方案只是sh,那么它可以正常工作。据我所知,当前pig在执行param声明时不支持复杂的shell脚本(比如if条件)。在调查期间,我考虑了我朋友提出的解决实际问题的另一种方法。
我不是将“true”或“false”值传递给“$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;

正如我所料,它工作得很好。

doinxwow

doinxwow3#

我不熟悉pig,但我怀疑它和其他程序一样 sh 运行外部shell命令。

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

不是有效的sh语法:the == 操作符是bash扩展。尝试

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

两边的双引号 $condition 在你的情况下可能需要也可能不需要,但它们通常是必要的,所以养成使用它们的习惯。在unix shell(bash或sh)中, "$condition" 表示“变量的值” condition “鉴于 $condition 意思是“取变量的值 condition ,将其拆分为单词,并将每个单词视为一个glob模式”;除非你想让这一切发生,否则就用双引号。
您可以阅读dash或posh手册,了解plain支持哪些功能 sh . 有几种实现 sh 周围;短跑是一种常见的运动,虽然不那么时髦,但它非常接近最大的共同点。如果愿意,您可以阅读posix标准,但它的可读性甚至不如手册页。

相关问题