我需要用pig-udf替换元组的字符。例如,如果我在文件中有一行“hello world,hello world,hello\world”需要转换为“hello\u world,hello\u world,hello\u world”。为此,我尝试了以下自定义项:
package myUDF;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
public class ReplaceValues extends EvalFunc<Tuple>
{
public Tuple exec(Tuple input) throws IOException {
if (input == null || input.size() == 0)
return null;
try{
String str = (String)input.get(0);
str=str.replace(" ", "_");
str=str.replace("/","");
str=str.replace("\\","");
TupleFactory tf = TupleFactory.getInstance();
Tuple t = tf.newTuple();
t.append(str);
return t;
}catch(Exception e){
throw new IOException("Caught exception processing input row ", e);
}
}
}
但当通过pig脚本调用此udf时,我面临问题,请帮助我解决此问题:
A = load '/user/cloudera/Stage/ActualDataSet.csv' using PigStorage(',') AS (Rank:chararray,NCTNumber:chararray,Title:chararray,Recruitment:chararray);
B = FILTER A by Rank == 'Rank';
C = FOREACH B GENERATE PigUDF.ReplaceValues(B);
错误:pig脚本未能分析:无效的标量投影:b:需要从关系投影列才能将其用作标量
2条答案
按热度按时间nx7onnlm1#
必须传递要修改的字段,而不是关系b。假设要匹配的字段是title,则可以如下所示调用udf
请注意,如果要在整个记录中替换它,则load语句不正确。必须将整个记录作为一个记录加载
line:chararray
然后通过考试line
你的自由基。此外,您可以使用
REGEX
匹配并替换您选择的字符串。nle07wnf2#
在pig脚本中,在udf中传递整个包“b”,同时它接受tuple作为参数。
而是像下面给出的b.title那样传递字段。
您也可以在以下行中的其他字段上调用此自定义项: