2016-02-26 84 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 –

相关问题