Hive 自动增量 UDF 没有给出想要的结果

Posted

技术标签:

【中文标题】Hive 自动增量 UDF 没有给出想要的结果【英文标题】:Hive auto increment UDF doesn't give desired results 【发布时间】:2017-05-25 03:20:14 【问题描述】:

我正在尝试在Hive 中创建一个UDF。这个UDF 必须自动递增一个名为idhive 表列。

下面是创建UDFJava代码。

package myudf;

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


@UDFType(deterministic = false, stateful = true)
public class autoincrement extends UDF

      int lastValue;

    public int evaluate() 

     lastValue++;

        return lastValue;

   

 

现在我可以创建一个 jar 文件并将该 jar 文件添加到 hive 中,如下所示:

add jar /home/cloudera/Desktop/increment.jar;

然后创建一个临时函数

create temporary function inc as 'myudf.autoincrement';

创建如下表。

Create table abc(id int, name string)

插入值:

INSERT into TABLE abc SELECT inc() as id, 'Tim';

执行选择语句:

select * from abc;

输出:

1  Tim

插入值:

INSERT into TABLE abc SELECT inc() as id, 'John';

执行选择语句:

select * from abc

输出:

1  Tim
1  John

但我期待的是当我第二次插入值时。

我的预期输出是:

1  Tim
2  John

如何获得预期的输出。我应该在Java 代码中进行哪些更改以获得所需的结果?

我也可以在Spark 中使用相同的功能吗

当我这样做时,我会感到兴奋

sqlContext.sql("show functions") 

它显示了Hive中所有可用函数的列表

但是当我这样做时

sqlContext.sql("INSERT into TABLE abc SELECT inc() as id, 'Jim'")

我收到以下错误

pyspark.sql.utils.AnalysisException: u'undefined function inc; line 1 pos 29'

如何在pyspark 中创建相同的UDF 并获得所需的输出

插入语句同时执行会发生什么?

【问题讨论】:

这不是 UDF 的工作方式,UDF 只能知道它传递的值,你不能拥有全局状态。 如果您只需要唯一 ID,您可以使用 ***.com/questions/33102727/… 中的解决方案,否则您将不得不进行排序 【参考方案1】:

按照以下步骤进行

    将插入更改为 INSERT into TABLE abc SELECT max(id)+1 as id, 'Tim' from abc; 或 修改 UDF 以将 int 列作为输入并返回 input+1 将插入修改为 INSERT into TABLE abc SELECT inc(max(id)) as id, 'Tim' from abc;

你必须在 hive 中尝试 SQL 的正确性,因为我已经检查过它在 mysql 中有效。

【讨论】:

以上是关于Hive 自动增量 UDF 没有给出想要的结果的主要内容,如果未能解决你的问题,请参考以下文章

自动增量 UDF 在 hive 中工作,但在 Impala 中返回 null

UDFRowSequence 不起作用

Hive3.1.2自带的系统函数及UDF的随系统自动注册

Hive3.1.2自带的系统函数及UDF的随系统自动注册

增量更新 Hive 表数据

如何在jpa中实现自动增量