2016-02-26 137 views
1

我在使用callUDF功能掙扎,我總是收到錯誤,表示函數沒有註冊。我粘貼下面的示例代碼:Apache Spark 1.6.0,callUDF失敗

UDF1<String, String> func = new UDF1<String, String>(){ 
     public String call(String s) throws Exception { 
      return s +"fixedString"; 
    } 
}; 
sqlContext.udf().register("test",func, DataTypes.StringType); 
out = out.select(out.col("VERSION"),callUDF("test",out.col("STEP_EXECUTION_ID"))); 

我總是收到以下錯誤,代碼中缺少的是什麼。

org.apache.spark.sql.AnalysisException: undefined function test; 
    at org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry$$anonfun$2.apply(FunctionRegistry.scala:65) 
    at org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry$$anonfun$2.apply(FunctionRegistry.scala:65) 
    at scala.Option.getOrElse(Option.scala:120) 
    at org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry.lookupFunction(FunctionRegistry.scala:64) 
+0

錯誤是org.apache.spark.sql.AnalysisException:未定義的函數測試; –

+0

然後你最好編輯你的問題來提高可讀性。 – Akira

+0

沒關係。我剛剛做完。 – Akira

回答

1

我已經解決了這個問題,所以在這裏張貼如果其他國家都面臨着類似的問題。我有兩個問題,1.在一列中生成UUID 2.從列值生成計算值。

問題1:

import java.util.UUID; 

public class RandomGenerator extends scala.runtime.AbstractFunction0<String> { 
    public String apply() { 
     return UUID.randomUUID().toString(); 
    } 
} 

在這種情況下,沒有必要與sqlcontext

df.withColumn("UUID", callUDF(new RandomGenerator(), DataTypes.StringType)).show(); 

問題2註冊該:

在這種情況下上面的方法可以使用,或者有人能做到以下也是

UDF1< Integer, Integer> func = new UDF1<Integer, Integer>() { 
    public Integer call(Integer s) throws Exception { 
     return calculate(s); 
    } 
}; 

sqlContext.udf().register("calculate", func, DataTypes.IntegerType); 
df.select(df.col("calVal"), callUDF("calculate", df.col("value"))).show(); 
1

基於您的代碼似乎功能測試不能被發現,因爲Scala代碼試圖做反思,並找到一個名爲test的函數,它接受一個長或正在使用作爲在STEP_EXECUTION_ID ID任何類型柱。

嘗試更改UDF的參數類型以匹配列類型。事情是這樣的:

public String call(Long id) throws Exception

+0

我嘗試了一個字符串類型的列,錯誤仍然是一樣的 –

+0

這是可能的,那麼你註冊的UDF出哪裏看不到。嘗試在FunctionRegistry.scala上具有檢查點的情況下進行調試,以查看UDF註冊表的可見內容。 – Akira

+0

功能也註冊sqlContext.functionRegistry()。lookupFunction(「xyz」)。isDefined()返回true –