【问题标题】:method my_udf has return statement; needs result type方法 my_udf 有返回语句;需要结果类型
【发布时间】:2020-12-22 11:54:35
【问题描述】:

我读到在大多数情况下都不需要为 udf 指定返回类型,但如果您添加 return 语句,则有必要。

我有以下 udf,它在内部迭代一个列表,如果匹配,我希望 udf 立即返回。根据我在这里找到的其他答案,我尝试了以下两种方法来定义返回类型:

def removeSalutation = udf((name: String) => String {

    val salutationList = List("MRS", "MR", "MSTR", "MISS", "MS", "DR")

    for(salutation <- salutationList){
        if(name.endsWith(salutation)){
            return name.dropRight(salutation.length())
        }
    }
    return name
    
})

上面的脚本只是返回一个错误

def removeSalutation = udf[String, String]((name: String) => {

    val salutationList = List("MRS", "MR", "MSTR", "MISS", "MS", "DR")

    for(salutation <- salutationList){
        if(name.endsWith(salutation)){
            return name.dropRight(salutation.length())
        }
    }
    return name
    
}) 

上面的脚本一直在说:

错误:方法 removeSalutation 有返回语句;需要结果类型

指定返回类型的正确方法是什么?

【问题讨论】:

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


    【解决方案1】:

    分别定义函数如下:

    def _removeSalutation(name: String) : String = {
        val salutationList = List("MRS", "MR", "MSTR", "MISS", "MS", "DR")
        for(salutation <- salutationList){
            if(name.endsWith(salutation)){
                return name.dropRight(salutation.length())
            }
        }
        return name
    }
    
    val removeSalutation = udf(_removeSalutation _)
    

    【讨论】:

    • 谢谢,这个有效。我试图一次完成所有事情,即没有你添加的最后一行,但似乎不可能
    • @IgnacioAlorre 见this。 Return 不应该在 Scala 的 lambda 函数中使用。
    • 我知道,也没有循环,实际上我从这个问题开始。但在这种情况下,我并没有遵循纯粹的函数式编程模式
    • @IgnacioAlorre 再看一遍,我认为 UDF 可能没有必要...为什么不使用 replace...?
    • @IgnacioAlorre 这就是美元符号的作用——它表示正则表达式中的行尾
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2014-09-18
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多