Как мне использовать условие ANY для фильтрации, если какие-либо строки группы имеют значение 0?

#scala #apache-spark

#scala #apache-spark

Вопрос:

Допустим, у меня есть этот фрейм данных…

 var df = Seq(("Steve",1),("Steve",0),("Michael",3),("Michael",2),("Katherine",4),("Katherine",0),("Devin",0),("Devin",0)).toDF("name","score")
  

введите описание изображения здесь

Я хочу вернуть уникальные имена, в которых НИ один из их баллов не равен нулю. Таким образом, в этом случае единственным возвращаемым именем будет Michael, поскольку оба его результата выше нуля.

Большое спасибо!

Ответ №1:

Если вы хотите, чтобы условие применялось к нескольким строкам, вам нужно использовать функции groupBy или Window

В вашем случае вы можете сгруппировать по столбцу «имя», объединить список оценок для каждого имени, а затем отфильтровать все записи, в которых список оценок содержит 0. Ваш код будет:

 import org.apache.spark.sql.functions.{col, collect_set, array_contains, not}

df.groupBy("name")
  .agg(collect_set(col("score")).as("all_scores"))
  .filter(not(array_contains(col("all_scores"), 0)))
  .select("name")