Hive自动增量UDF没有给出期望的结果

时间:2017-05-25 03:20:14

标签: apache-spark hive pyspark udf

我正在尝试在UDF中创建Hive。此UDF必须自动增加名为hive的{​​{1}}表格列。

现在,以下是id代码,用于创建Java

UDF

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

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;

   }

} 

然后创建一个临时函数

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' 中创建相同的UDF并获得所需的输出

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

1 个答案:

答案 0 :(得分:1)

按照以下步骤

  1. 将插入更改为INSERT到TABLE abc SELECT max(id)+1 as id,'Tim'from abc;
  2. 修改UDF以将int列作为输入并返回input + 1
  3. 修改你的插入INSERT到TABLE abc SELECT inc(max(id))as id,'Tim'from abc;
  4. 你必须在我检查过的时候在hive中尝试SQL的正确性,它在MYSQL中工作。