Фрейм данных отфильтровывает строки (строку), содержащие указанные слова

#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. О, извините, я неправильно истолковал ваш первоначальный вопрос, я обновлю свой ответ