Hive 自动增量 UDF 没有给出想要的结果
Posted
技术标签:
【中文标题】Hive 自动增量 UDF 没有给出想要的结果【英文标题】:Hive auto increment UDF doesn't give desired results 【发布时间】: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,您可以使用 ***.com/questions/33102727/… 中的解决方案,否则您将不得不进行排序 【参考方案1】:按照以下步骤进行
-
将插入更改为 INSERT into TABLE abc SELECT max(id)+1 as id, 'Tim' from abc;
或
修改 UDF 以将 int 列作为输入并返回 input+1
将插入修改为 INSERT into TABLE abc SELECT inc(max(id)) as id, 'Tim' from abc;
你必须在 hive 中尝试 SQL 的正确性,因为我已经检查过它在 mysql 中有效。
【讨论】:
以上是关于Hive 自动增量 UDF 没有给出想要的结果的主要内容,如果未能解决你的问题,请参考以下文章