#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")