【发布时间】:2017-05-25 03:20:14
【问题描述】:
我正在尝试在Hive 中创建一个UDF。这个UDF 必须自动递增一个名为id 的hive 表列。
下面是创建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 文件添加到 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,您可以使用 stackoverflow.com/questions/33102727/… 中的解决方案,否则您将不得不进行排序
标签: apache-spark hive pyspark udf