2017-05-25 36 views
0

我正在嘗試在Hive中創建UDF。這UDF必須自動增加一個名爲idhive表列。配置單元自動增加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並獲得所需的輸出

當插入語句在同一時間執行,會發生什麼?

+0

這不是UDF的工作方式,UDF只能瞭解其通過的值,不能擁有全局狀態。 – maxymoo

+0

如果你只需要唯一的ID你可以使用https://stackoverflow.com/questions/33102727/primary-keys-with-apache-spark中的解決方案,否則你將不得不做一個排序 – maxymoo

回答

1

按照以下步驟

  1. 改變您的插入到插入到表格ABC SELECT MAX(ID)+1作爲ID, '添' 從ABC;
  2. 修改UDF採取INT列作爲輸入,並返回輸入+ 1
  3. 修改插入到插入到表格ABC SELECT INC(MAX(ID))作爲ID, '添' 從ABC;

您必須嘗試SQL配置單元中的SQL的正確性,因爲我已經檢查並且它在MYSQL中有效。