Hive UDTF 单独处理每一行并转发每一行的输出。 我需要对所有函数输出进行一些操作。 有没有办法在处理完所有行后将所有函数输出转发一次?
提前致谢!
最佳答案
是的,这种方式存在。
- 要对 UDF 的所有 输出进行一些更改,您首先必须
存储它。因此,在 UDF 类中创建字段以收集输出
它:
private List<SomeClass> output = new ArrayList<>();
- 然后在你的
process()
你应该使用的方法output.add()
反而 的forward()
.所以在process()
output
将被填补。 - 最后你得到了
close()
方法。它用于清洁 完成所有处理后通常不需要编码 里面有东西。但是在你的情况下,close()
是个好 处理的可能性output
Collection 并转发。
close()
的大概代码在这里:
@Override
public void close() throws HiveException {
for(String record: output){
forwardObjArray[0] = record.substring(3);
forward(forwardObjArray);
}
}
forwardObjArray
是 UDF 的另一个私有(private)字段。它用于优化资源使用(以避免在每次 forward()
调用之前创建包含 1 个元素的数组)。
但这种方式仅适用于在小型数据集上运行 UDTF 的情况。否则output
Collection 量将非常大。
如果您要在大型输入数据上运行 UDTF,我建议使用两个 UDTF。由于当前的 Hive 版本不允许使用嵌套的 UDTF,您可以使用子查询:
SELECT func2(processed)
FROM (
SELECT func1(fiels) AS processed
FROM table
) AS interm_table;
在func2()
您将实现用于操作 func1()
输出的逻辑.
关于java - 如何使用最后一个输入行转发 Hive UDTF 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34720149/