Я читал, что в большинстве сценариев не требуется указывать тип возвращаемого значения для 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 имеет оператор возврата; нужен тип результата
Каков правильный подход к указанию возвращаемого типа?
Определите функцию отдельно, как показано ниже:
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 Смотрите это. Возврат не должен использоваться в лямбда-функции в scala.
Я в курсе, и петель тоже нет, собственно с этого и начинаю вопрос. Но в данном случае я не следую исключительно шаблону функционального программирования.
@IgnacioAlorre, на второй взгляд, я думаю, что UDF могут не понадобиться ... почему бы не использовать replace
...?
Этот метод будет вызываться из кадра данных Spark. Чтобы очистить поле имени и создать новый столбец без приветствия. Не стесняйтесь написать ниже более чистый способ добиться этого, но с UDF, я думаю, можно найти
@IgnacioAlorre попробовать это? df.select(regexp_replace($"col_name", "MRS$|MR$|MSTR$|MISS$|MS$|DR$", ""))
Вроде бы хорошо, только беспокоюсь, приветствие нужно удалять только в том случае, если оно присутствует в самом конце строки. например, если имя Драто или что-то в этом роде, DR не следует удалять
@IgnacioAlorre вот что делает знак доллара - он указывает на конец строки в регулярном выражении
Спасибо, этот работает. Я пытался сделать все за один раз, то есть без последней добавленной строки, но, похоже, это невозможно