Linux 带替代项的重载方法值udf

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的输入应该在方法本身内部 例如,您有这样一

我正在尝试使用以下代码在Databricks Community Edition中注册一个表:

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)
    
  • 在udf中调用
    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)
    })