Метод my_udf имеет оператор возврата; нужен тип результата

Я читал, что в большинстве сценариев не требуется указывать тип возвращаемого значения для 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 имеет оператор возврата; нужен тип результата

Каков правильный подход к указанию возвращаемого типа?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
793
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 _)

Спасибо, этот работает. Я пытался сделать все за один раз, то есть без последней добавленной строки, но, похоже, это невозможно

Ignacio Alorre 22.12.2020 13:32

@IgnacioAlorre Смотрите это. Возврат не должен использоваться в лямбда-функции в scala.

mck 22.12.2020 13:32

Я в курсе, и петель тоже нет, собственно с этого и начинаю вопрос. Но в данном случае я не следую исключительно шаблону функционального программирования.

Ignacio Alorre 22.12.2020 13:35

@IgnacioAlorre, на второй взгляд, я думаю, что UDF могут не понадобиться ... почему бы не использовать replace ...?

mck 22.12.2020 13:36

Этот метод будет вызываться из кадра данных Spark. Чтобы очистить поле имени и создать новый столбец без приветствия. Не стесняйтесь написать ниже более чистый способ добиться этого, но с UDF, я думаю, можно найти

Ignacio Alorre 22.12.2020 13:38

@IgnacioAlorre попробовать это? df.select(regexp_replace($"col_name", "MRS$|MR$|MSTR$|MISS$|MS$|DR$", ""))

mck 22.12.2020 13:41

Вроде бы хорошо, только беспокоюсь, приветствие нужно удалять только в том случае, если оно присутствует в самом конце строки. например, если имя Драто или что-то в этом роде, DR не следует удалять

Ignacio Alorre 22.12.2020 13:45

@IgnacioAlorre вот что делает знак доллара - он указывает на конец строки в регулярном выражении

mck 22.12.2020 13:45

Другие вопросы по теме