Linux 带替代项的重载方法值udf
我正在尝试使用以下代码在Databricks Community Edition中注册一个表:Linux 带替代项的重载方法值udf,linux,scala,apache-spark,user-defined-functions,databricks,Linux,Scala,Apache Spark,User Defined Functions,Databricks,我正在尝试使用以下代码在Databricks Community Edition中注册一个表: import org.apache.spark.sql.functions.udf val getDataUDF(url: String):Unit = udf(getData(url: String):Unit) 但是,我得到一个错误: 重载的方法值udf,带有可选项: 您的UDF语法看起来有点奇怪,在调用getData()时不应该定义类型。此外,UDF的输入应该在方法本身内部 例如,您有这样一
import org.apache.spark.sql.functions.udf
val getDataUDF(url: String):Unit = udf(getData(url: String):Unit)
但是,我得到一个错误:
重载的方法值udf,带有可选项:
您的UDF语法看起来有点奇怪,在调用
getData()
时不应该定义类型。此外,UDF的输入应该在方法本身内部
例如,您有这样一个方法getData
(它应该有一个返回值):
要使其成为udf,有两种方法:
getData
val getData: (String => String) = {...}
val getDataUDF = udf(getData)
getData
方法
val getDataUDF = udf((url: String) => {
getData(url)
})
这两种方法都应该有效,我个人认为方法1看起来更好。我建议在方法1中定义
val getData
(即定义函数)。您要做的是定义一个返回函数的方法。但此函数始终相同,因此在我的系统中不需要使用def
opinion@RaphaelRoth这是一个正确的观点。我更改了答案以反映这一点。谢谢。但是我相信我遇到的问题是,我们不能在def中使用与注册中相同的签名。val getDataUDF(url:String):Unit=udf(getData(url:String):Unit)应该改为val getDataUDF(url:String):Unit=udf(getData(u:String):Unit),但是现在我解决了这个错误,我得到了一个异常java.lang.UnsupportedOperationException:Schema类型Unit不受支持,我将研究它。再次感谢。@user3439308我认为问题在于将单位作为UDF的返回值是没有意义的。您需要返回要放入数据帧的内容。
val getDataUDF = udf((url: String) => {
getData(url)
})