gpt4 book ai didi

java - 如何使用最后一个输入行转发 Hive UDTF 输出

转载 作者:可可西里 更新时间:2023-11-01 14:52:50 26 4
gpt4 key购买 nike

Hive UDTF 单独处理每一行并转发每一行的输出。我需要对所有函数输出进行一些操作。有没有办法在处理完所有行后将所有函数输出转发一次?

提前致谢!

最佳答案

是的,这种方式存在。

  1. 要对 UDF 的所有 输出进行一些更改,您首先必须存储它。因此,在 UDF 类中创建字段以收集输出它:private List<SomeClass> output = new ArrayList<>();
  2. 然后在你的process()你应该使用的方法 output.add()反而的 forward() .所以在 process() output将被填补。
  3. 最后你得到了 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com