#scala
#scala
Вопрос:
Вот мой вопрос в Scala. У меня есть фрейм данных с одним столбцом, тип данных которого — string . Например, столбец имеет 4 значения
"Abc", "dfea", "skjod", "aaa"
И
List = ["ab", "kj"]
Мне нужно отфильтровать строки, которые содержат любое значение в списке. Итак, для приведенных выше данных я получу вторую и четвертую строки.
Вот мой код:
val del_blk = (arg: String) => {
for (word <- list) {
if (arg.contains(word)) 1
}
0
}
val blkUDF = udf(del_blk)
df
.withColumn("blk", blkUDF(col("col")))
.filter(col("blk") === 0)
.select("col")
.show()
Ответ №1:
val del_blk = (arg: String) => {
for (word <- list) {
if (arg.contains(word)) 1
}
0
}
эквивалентно
val del_blk = (arg: String) => {
list.foreach(word => if (arg.contains(word)) 1)
0
}
Я подозреваю, что вы скорее намереваетесь что-то вроде
def containsForbiddenWord(word: String): Boolean =
list.exists(forbidden => word.contains(forbidden))
Комментарии:
1. я новичок в scala, не могли бы вы подробно объяснить. это не работает, когда после вашего определения добавляется значение blkUDF = udf(containsForbiddenWord(_))
2.
filter(col("col"), udf(containsForbiddenWord)
?3. это не работает.. [ошибка] Вы можете сделать это преобразование явным, написав
containsForbiddenWord _
илиcontainsForbiddenWord(_)
вместоcontainsForbiddenWord
4. Действительно, из-за перегрузок, в которых он нуждается
containsForbiddenWord _
, илиcontainsForbiddenWord(_)
вместоcontainsForbiddenWord
5. Я попробовал containsForbiddenWord _. [ошибка] не может быть применена к (org.apache.spark.sql.Column, org.apache.spark.sql.expressions. Пользовательская функция)
Ответ №2:
Лучше не использовать udfs в spark, поскольку они не оптимизированы и работают медленно. Вы можете сделать это с помощью spark SQL следующим образом:
df.withColumn("blk", col("col").isin(list :_*))
.filter(col("blk") === false)
Комментарии:
1. привет, это не работает. не удается отфильтровать строки, содержащие значение в списке
2. О, извините, я неправильно истолковал ваш первоначальный вопрос, я обновлю свой ответ