16
votes

Actually I am writing PIG Script and want to execute some set of statements if one of the condition is satisfied.

I have set one variable and checking for some value of that variable. Suppose

if flag==0 then
  A = LOAD 'file' using PigStorage() as (f1:int, ....);
  B = ...;
  C = ....;
else 
  again some Pig Latin statements

Can I do this in PIG Script? If yes, then how can I do this?

Thanks.

5
I came across conditional operator in Pig Latin like (a == b ? c1 : c2);. But How can I insert bulk of Pig Statements in between that? - Bhavesh Shah
Bhavesh, You need to write a wrapper for that The recommended approach for writing programs that have conditional logic or loop constructs is to embed Pig Latin in another language like Python, JavaScript or Java, and manage the control flow from there. - Nag

5 Answers

22
votes

Yes, Pig does offer an if-then-else construction, but it is not used in the way you're asking.

Pig's if-then-else is an arithmetic operator invoked with the shorthand "condition ? true_value : false_value" as part of an expression, such as:

X = FOREACH A GENERATE f2, (f2==1?1:COUNT(B));

You have to already have loaded the table A to do this. To execute control flow around entire Pig statements you'll need something like oozie, as suggested by Fakrudeen.

6
votes

You can create a Python wrapper around your Pig script. See Embedded Pig in the docs.

5
votes

Pig is data flow language not control flow. Only construct which comes close is PIG split, but it is very limited.

You can use oozie and its decision construct with two pig scripts.

1
votes

Create a UDF (say, in Java) and then embed that into your PIG script. You will need to 'register' the jar file that you generate after writing the UDF.

//(something like this), say your Java UDF class is UDFCondition & the generated jar file is PigUDFCondition.jar, then in your PIG Code

register PigUDFCondition.jar

X = foreach A generate UDFCondition(..flag...)
0
votes

There is a CASE Statement available from version 0.12 onwards.