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代码,请检查一下。