hive自动递增udf不能给出期望的结果

fhity93d  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(376)

我想创造一个 UDFHive . 这个 UDF 必须自动递增 hive 已调用表列 id .
下面是 Java 用于创建 UDF .

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文件添加到配置单元中,如下所示:

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';

do select语句:

select * from abc;

输出:

1  Tim

插入值:

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

do select语句:

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'

如何创建相同的 UDFpyspark 并得到所需的输出
当insert语句同时执行时会发生什么?

6ju8rftf

6ju8rftf1#

按照以下步骤操作
将insert改为insert into table 选择max(id)+1作为id,中的“tim”;

修改自定义项,将int列作为输入并返回input+1
将insert修改为insert到 select inc(max(id))表中,作为id,“tim”from ;
您必须在配置单元中尝试sql的正确性,正如我所检查的,它在mysql中工作。

相关问题