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

时间:2016-01-11 11:16:29

标签: java hadoop hive udf

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

是的,这种方式存在。

  1. 要使用UDF的 所有 输出进行一些更改,您首先要 存储它。因此,在UDF类中创建字段以收集输出 它:private List<SomeClass> output = new ArrayList<>();
  2. 然后,在您的process()方法中,您应该使用output.add() forward()。因此,在process()中,output将被填充。
  3. 最后你有了close()方法。它用于清洁 在所有处理之后,通常不需要编码 其中的东西。但是在你的情况下,close()是一个很好的 处理output集合并转发它的可能性。
  4. 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()输出的逻辑。