Hive UDTF单独处理每一行并为每一行转发输出。 我需要对所有函数输出进行一些操作。 在处理完所有行之后,有没有办法转发所有函数输出一次?
提前致谢!
答案 0 :(得分:1)
是的,这种方式存在。
private List<SomeClass> output = new ArrayList<>();
process()
方法中,您应该使用output.add()
forward()
。因此,在process()
中,output
将被填充。close()
方法。它用于清洁
在所有处理之后,通常不需要编码
其中的东西。但是在你的情况下,close()
是一个很好的
处理output
集合并转发它的可能性。 close()
的近似代码在这里:
@Override
public void close() throws HiveException {
for(String record: output){
forwardObjArray[0] = record.substring(3);
forward(forwardObjArray);
}
}
forwardObjArray
是UDF的另一个私有字段。它用于优化资源使用(以避免在每次forward()
调用之前创建具有1个元素的数组)。
但这种方式仅适用于在小型数据集上运行UDTF的情况。否则output
集合将非常大。
如果你要在大输入数据上运行UDTF,我建议使用两个UDTF。由于当前的Hive版本dosn允许使用嵌套的UDTF,您可以使用子查询:
SELECT func2(processed)
FROM (
SELECT func1(fiels) AS processed
FROM table
) AS interm_table;
在func2()
中,您将实施用于操纵func1()
输出的逻辑。