【问题标题】:autoincrement udf in hive蜂巢中的自动增量udf
【发布时间】:2013-02-04 10:43:11
【问题描述】:

我在 hive 中创建了一个 udf 以在 hive 中添加自动增量列。

import org.apache.hadoop.hive.ql.exec.UDF;

public class AutoIncrUdf extends UDF {
    int Value;

    public int evaluate() {
        Value++;
        return Value;
    }
}  

我在桌子上使用时创建了一个临时函数temp

Select temp() from table1; 

它给出所有行:

 1
 1
 1
 1 

等等。但我想要它作为

1
2
3
4

【问题讨论】:

  • 嗨@bat_rock 我遇到了同样的问题。评论以检查您在过去 4 年中是否找到任何解决方案:)

标签: hadoop user-defined-functions hive


【解决方案1】:

我认为最好在 hive 中使用以下代码进行自动增量 udf:

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.udf.UDFType;

@UDFType(deterministic = false)
public class AutoIncrementUDF extends UDF {

    int ctr ;

    public int evaluate() {
        ctr++;
        return ctr;
    }
}

【讨论】:

  • 欢迎来到 SO。参观stackoverflow.com/tour,了解如何写出更好的答案。这是 3 年前的问题,您的答案与下面来自 @neerajyadav 的答案没有什么不同?同时发生了什么变化?
【解决方案2】:

它应该工作。每次调用都会创建一个 UDF 类的实例。也许试试static int Value; .. GL

【讨论】:

  • 是的,这应该可以。但请注意,这种类型的 UDF 依赖于通过一个映射器/归约器执行的所有行,以便对行进行完美编号。可能不是您的具体问题,因为您最终得到的重复次数并不完全相同。
【解决方案3】:

它对我有用。

试试下面的:

http://svn.apache.org/repos/asf/hive/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/udf/UDFRowSequence.java

CREATE TEMPORARY FUNCTION rowSequence AS .UDFRowSequence';

SELECT rowSequence(100) AS id, field1, field2 from 'table' where 'condition';

【讨论】:

  • 我必须使用这个命令才能让它工作:CREATE TEMPORARY FUNCTION rowSequence AS 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';
【解决方案4】:

为你的类添加状态属性:

@UDFType(stateful = true)
public class AutoIncrUdf extends UDF {
    ...
}

需要添加注释@UDFType(stateful = true),否则Hive 列中的计数器值不会增加,它只会为所有行返回值1,而不是实际的行号。这与您面临的问题相同。

【讨论】:

    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2022-11-10
    • 2015-05-20
    • 1970-01-01
    相关资源
    最近更新 更多