2016-12-20 3 views
1

Я пытаюсь фильтровать строки фрейма PySpark, где значения всех столбцов равны нулю.PySpark Фильтр DataFrame с использованием логического И над списком условий

Я надеялся использовать что-то вроде этого:

from pyspark.sql.functions import col 
df.filter(all([(col(c) != 0) for c in df.columns])) 

Но я получаю ValueError:

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions. 

Есть ли способ, чтобы выполнить логическое и в списке условий?

ответ

4

reduce Просто список предикатов

from pyspark.sql.functions import lit 
from operator import and_ 
from functools import reduce 

df.where(reduce(and_, (col(c) != 0 for c in df.columns))) 

или

df.where(reduce(and_, (col(c) != 0 for c in df.columns), lit(True))) 

, если вы ожидаете, что список предикатов может быть пустым.

Например, если данные выглядит следующим образом:

df = sc.parallelize([ 
    (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 1) 
]).toDF(["x", "y", "z"]) 

результат будет:

+---+---+---+ 
| x| y| z| 
+---+---+---+ 
| 1| 1| 1| 
+---+---+---+ 
Смежные вопросы