产生与输入具有相同模式的输出的 Pig UDF

Posted

技术标签:

【中文标题】产生与输入具有相同模式的输出的 Pig UDF【英文标题】:Pig UDF that produces output with the same schema as its input 【发布时间】:2013-12-06 15:44:20 【问题描述】:

我正在尝试创建一个接受元组并返回元组的 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 的元组的包,而是包含包含 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】:

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

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

如果您想对很多字段执行此操作,这可能会变得很麻烦,但仍有一些方法可以最大限度地减少输入。 (例如,等到您执行了这个 UDF 后才提供您的架构,而不是在 LOAD 语句中这样做)。

【讨论】:

问题是我需要 udf 中的模式,所以我必须在加载和 foreach 中都指定它。还是谢谢! 考虑我有 500 个库,我不想要 schema::f1 而只是 f1,那么在这种情况下应该怎么做? return new Schema(new Schema.FieldSchema("schema", tupleSchema));。这是我来自output schema()的回复声明。

以上是关于产生与输入具有相同模式的输出的 Pig UDF的主要内容,如果未能解决你的问题,请参考以下文章

Pig UDF 将文件写入 HDFS

sql server udf,返回与输入表达式相同的类型

多个元组作为用 Java 编写的 pig UDF 中的输入

在 Tensorflow 中具有相同填充的均匀大小的内核

用 Python 为 Pig 编写 UDF

keras 中的输入形状(此损失期望目标具有与输出相同的形状)