【问题标题】:Overloaded method value udf with alternatives使用替代方法重载方法值 udf
【发布时间】:2018-05-17 12:00:15
【问题描述】:

我正在尝试使用以下代码在 Databricks 社区版中注册一个表:

import org.apache.spark.sql.functions.udf

val getDataUDF(url: String):Unit = udf(getData(url: String):Unit)

但是,我收到一个错误:

使用替代方法重载方法值 udf:

【问题讨论】:

    标签: linux scala apache-spark user-defined-functions databricks


    【解决方案1】:

    你的 UDF 语法看起来有点奇怪,你不应该在调用getData() 时定义类型。此外,UDF 的输入应该在方法本身内部。

    例如,你有一个这样的方法getData(它应该有一个返回值):

    def getData(url: String): String = {...}
    

    要使其变成udf,有两种方法:

    1. getData重写为函数

      val getData: (String => String) = {...}
      val getDataUDF = udf(getData)
      
    2. 在udf里面调用getData方法

      val getDataUDF = udf((url: String) => {
        getData(url)
      })
      

    这两种方式都应该可以,我个人认为方法1看起来更好一些。

    【讨论】:

    • 我建议在方法1中定义val getData(即定义一个函数)。你要做的是定义一个返回函数的方法。但是这个功能总是一样的,所以我认为没有必要使用def
    • @RaphaelRoth 这是一个有效的观点。我更改了答案以反映这一点。
    • 谢谢。但是......我相信我遇到的问题是我们不能在 def 中使用与注册相同的签名。 val getDataUDF(url: String):Unit = udf(getData(url: String):Unit) 应该代替 val getDataUDF(url: String):Unit = udf(getData(_: String):Unit) 但现在我已解决那个错误我得到一个异常 java.lang.UnsupportedOperationException: 不支持类型 Unit 的模式,我现在将研究。再次感谢。
    • @user3439308 我认为问题在于将 Unit 作为 UDF 的返回值是没有意义的。您需要返回一些内容以放入数据框中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多