Hive 自动递增 UDF 没有给出预期的结果

Hive auto increment UDF doesn't give desired results

我正在尝试在 Hive 中创建一个 UDF。此 UDF 必须自动递增名为 id.

hive table 列

下面是创建 UDF.

Java 代码
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';

创建 table 如下所示。

Create table abc(id int, name string)

插入值:

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

执行select语句:

select * from abc;

输出:

1  Tim

插入值:

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

执行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'

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

insert语句同时执行会怎样?

按照以下步骤操作

  1. 将您的插入更改为 INSERT into TABLE abc SELECT max(id)+1 as id, 'Tim' from abc;
  2. 修改UDF,将int列作为输入,return输入+1
  3. 将您的插入修改为 INSERT into TABLE abc SELECT inc(max(id)) as id, 'Tim' from abc;

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