使用pig更改元组

r7xajy2e  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(267)

我需要用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:需要从关系投影列才能将其用作标量

nx7onnlm

nx7onnlm1#

必须传递要修改的字段,而不是关系b。假设要匹配的字段是title,则可以如下所示调用udf

C = FOREACH B GENERATE B.Rank,B.NCTNumber,PigUDF.ReplaceValues(B.Title),B.Recruitment;

请注意,如果要在整个记录中替换它,则load语句不正确。必须将整个记录作为一个记录加载 line:chararray 然后通过考试 line 你的自由基。
此外,您可以使用 REGEX 匹配并替换您选择的字符串。

nle07wnf

nle07wnf2#

在pig脚本中,在udf中传递整个包“b”,同时它接受tuple作为参数。
而是像下面给出的b.title那样传递字段。

C = FOREACH B GENERATE PigUDF.ReplaceValues(B.Title);

您也可以在以下行中的其他字段上调用此自定义项:

C = FOREACH B GENERATE PigUDF.ReplaceValues(B.Title), PigUDF.ReplaceValues(B.Rank);

相关问题