0
我正在嘗試在Hive
中創建UDF
。這UDF
必須自動增加一個名爲id
的hive
表列。配置單元自動增加UDF不會給出預期的結果
現在以下是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';
執行select語句:
select * from abc;
輸出:
1 Tim
插入值:
INSERT into TABLE abc SELECT inc() as id, 'John';
執行select語句:
select * from abc
輸出:
1 Tim
1 John
但我所期待的是,當我插入值的第2次。
我的預期產量爲:
1 Tim
2 John
如何獲得預期的輸出。我應該在Java
代碼中更改哪些內容以獲得期望的結果?
,我可以使用相同的功能Spark
以及
火花,當我做
sqlContext.sql("show functions")
它顯示所有可用的功能Hive
列表但是,當我做
sqlContext.sql("INSERT into TABLE abc SELECT inc() as id, 'Jim'")
我得到了b elow錯誤
pyspark.sql.utils.AnalysisException: u'undefined function inc; line 1 pos 29'
如何創建pyspark
相同UDF
並獲得所需的輸出
當插入語句在同一時間執行,會發生什麼?
這不是UDF的工作方式,UDF只能瞭解其通過的值,不能擁有全局狀態。 – maxymoo
如果你只需要唯一的ID你可以使用https://stackoverflow.com/questions/33102727/primary-keys-with-apache-spark中的解決方案,否則你將不得不做一個排序 – maxymoo