Pig UDF使用与其输入相同的模式生成输出

时间:2013-12-06 15:44:20

标签: apache-pig

我正在尝试创建一个接受元组并返回元组的UDF。

A = LOAD 'file.txt' USING PigStorage(',') AS (f1:chararray);
DESCRIBE A
A: {f1: chararray}
B = FOREACH A GENERATE MyUDF(*);
DESCRIBE B
B: {(f1: chararray)}

但是,我希望B的格式为{f1: chararray},即我不想要一个包含元组元组的包,其中包含一个包含chararray元组的元组。

我可以使用FLATTEN,但架构如下所示: B: {null::f1: chararray}但我需要{f1: chararray}

以下是我的UDF的代码:

public class MyTest extends EvalFunc<Tuple> {

    public MyTest() {
    }

    @Override
    public Tuple exec(final Tuple input) throws IOException {
        //apply some logic (not relevant)
        return input;
    }

    @Override
    public Schema outputSchema(final Schema input) {
        try {
            final Schema outputTupleSchema = input.clone();
            return outputTupleSchema;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

有谁知道如何实现这一目标?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

可能还有其他方法可以解决这个问题,但最简单的是您已经使用的方法:FLATTEN。为什么不直接指定您真正想要的名字?无论如何,你都必须FLATTEN,因为你的UDF会返回一个元组,并且没有办法解决这个问题。

B = FOREACH A GENERATE FLATTEN(MyUDF(*)) AS f1;

如果你想用很多字段来做这件事,那可能会很麻烦,但仍然有办法减少打字。 (例如,等到执行此UDF以提供架构,而不是在LOAD语句中执行此操作。