我想创造一个 UDF
在 Hive
. 这个 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'
如何创建相同的 UDF
在 pyspark
并得到所需的输出
当insert语句同时执行时会发生什么?
1条答案
按热度按时间6ju8rftf1#
按照以下步骤操作
将insert改为insert into table 选择max(id)+1作为id,中的“tim”;
或
修改自定义项,将int列作为输入并返回input+1
将insert修改为insert到 select inc(max(id))表中,作为id,“tim”from ;
您必须在配置单元中尝试sql的正确性,正如我所检查的,它在mysql中工作。