If statement 更新if块中的常量,并将其提取为同一GENERATE语句中的字段

If statement 更新if块中的常量,并将其提取为同一GENERATE语句中的字段,if-statement,apache-pig,constants,extract,If Statement,Apache Pig,Constants,Extract,我有一个关系,如下加载到“调用” 我正在尝试更新关系,使其如下所示,我可以按第二个字段分组,以获得国家/地区的呼叫计数 (Header India, Header India) (Call1, Header India) (Call2, Header India) (END, Header India) (Header NZ, Header NZ) (Call1, Header NZ ) (Call2, Header NZ) (END, Header NZ) 第一个元组将始终是(头)。我正在使

我有一个关系,如下加载到“调用”

我正在尝试更新关系,使其如下所示,我可以按第二个字段分组,以获得国家/地区的呼叫计数

(Header India, Header India)
(Call1, Header India)
(Call2, Header India)
(END, Header India)
(Header NZ, Header NZ)
(Call1, Header NZ )
(Call2, Header NZ)
(END, Header NZ)
第一个元组将始终是(头)。我正在使用下面的代码,我想更新常量,然后将该常量提取为第二个字段。但它不起作用。有什么建议吗

%declare HeaderText 'Header '
calls = LOAD 'Data File';
extrctd = FOREACH calls GENERATE $0 as (country:chararray), (SUBSTRING($0,1,7)=='Header '?'$HeaderText'=$0:'$HeaderText') as (txt:chararray);

一个选择是您可以编写自己的UDF来解决这个问题。下面是示例代码

input.txt

Header India
Call1
Call2
END
Header NZ
Call1
Call2
END
PigScript:

REGISTER mycountry.jar;

calls = LOAD 'input.txt' AS (line:chararray);
extrctd = FOREACH calls GENERATE $0 AS country, mypackage.COUNTRY(line,'Header') as txt;
DUMP extrctd;
(Header India,Header India)
(Call1,Header India)
(Call2,Header India)
(END,Header India)
(Header NZ,Header NZ)
(Call1,Header NZ)
(Call2,Header NZ)
(END,Header NZ)
输出:

REGISTER mycountry.jar;

calls = LOAD 'input.txt' AS (line:chararray);
extrctd = FOREACH calls GENERATE $0 AS country, mypackage.COUNTRY(line,'Header') as txt;
DUMP extrctd;
(Header India,Header India)
(Call1,Header India)
(Call2,Header India)
(END,Header India)
(Header NZ,Header NZ)
(Call1,Header NZ)
(Call2,Header NZ)
(END,Header NZ)
示例UDF代码:下面的java类(COUNTRY和MyGlobal)编译并生成为
mycountry.jar

COUNTRY.java

   package mypackage;
    import java.io.IOException;
    import org.apache.commons.lang.StringUtils;
    import org.apache.pig.EvalFunc;
    import org.apache.pig.data.Tuple;

    class MyGlobal {
        public static String myCountry;
    }

    public class COUNTRY extends EvalFunc<String> {
    @Override
    public String exec(Tuple arg0) throws IOException {
            try
            {
                    String input = ((String) arg0.get(0));
                    String header = ((String) arg0.get(1));
                    String output;


                   if(input.startsWith(header))
                    {
                            output = input;
                            MyGlobal.myCountry = output;
                    }
                    else
                    {
                            output = MyGlobal.myCountry;
                    }
                    return output;
            }
            catch(Exception e)
            {
                throw new IOException("Caught exception while processing the input row ", e);
            }
        }
    }
package-mypackage;
导入java.io.IOException;
导入org.apache.commons.lang.StringUtils;
导入org.apache.pig.EvalFunc;
导入org.apache.pig.data.Tuple;
类MyGlobal{
公共静态字符串myCountry;
}
公共类国家扩展EvalFunc{
@凌驾
公共字符串执行器(元组arg0)引发IOException{
尝试
{
字符串输入=((字符串)arg0.get(0));
字符串头=((字符串)arg0.get(1));
字符串输出;
if(输入.起始带(标题))
{
输出=输入;
MyGlobal.myCountry=输出;
}
其他的
{
输出=MyGlobal.myCountry;
}
返回输出;
}
捕获(例外e)
{
抛出新IOException(“处理输入行时捕获的异常”,e);
}
}
}

谢谢SJ-这很有效。不过,我现在有一个新问题。在UDF中,我们寻找一个硬编码值,即“Header”。是否有某种方法可以将其作为调用pig脚本的参数传递?可以让EvalFunc接受多个参数吗?是的,您可以,您只需将此参数作为pig脚本调用程序中的第二个参数传递,并在UDF代码中解析它。我已经修改了上面的pig脚本和java代码,请检查一下。