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

标签 java hadoop hive udf

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/

相关文章:

java - 为什么 getScaledInstance() 不起作用?

hadoop - 了解 Hadoop MapReduce 中映射和 reduce task 的数量

java - MapWritable 的 MapWritable 上的迭代器

java - 使用 Thrift 运行 Hive Hook 时出现 YARN AM 容器错误

java - Hive JDBC - getConnection 失败时连接泄漏

java - 链表复制构造函数

java - 我的 LRUCache 代码有什么问题

Java 查找数组中的所有组合,这些组合加起来等于特定数字

hadoop - 在Kafka中如果参数 "retries"设置为1或更多,那么会自动重试吗?

sql - HIVe 创建不包含重复项的 Json 数组