我正在尝试创建一个接受元组并返回元组的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);
}
}
}
有谁知道如何实现这一目标?任何帮助将不胜感激。
答案 0 :(得分:1)
可能还有其他方法可以解决这个问题,但最简单的是您已经使用的方法:FLATTEN
。为什么不直接指定您真正想要的名字?无论如何,你都必须FLATTEN
,因为你的UDF会返回一个元组,并且没有办法解决这个问题。
B = FOREACH A GENERATE FLATTEN(MyUDF(*)) AS f1;
如果你想用很多字段来做这件事,那可能会很麻烦,但仍然有办法减少打字。 (例如,等到执行此UDF以提供架构,而不是在LOAD
语句中执行此操作。