PySpark DataFrame过滤器使用条件列表上的逻辑AND

Mar*_*kNS 1 apache-spark apache-spark-sql pyspark

我正在尝试过滤PySpark数据帧的行,其中所有列的值都为零.

我希望使用这样的东西:

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

但我得到一个ValueError:

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
Run Code Online (Sandbox Code Playgroud)

有没有办法执行逻辑和条件列表?

use*_*411 6

只是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)))
Run Code Online (Sandbox Code Playgroud)

要么

df.where(reduce(and_, (col(c) != 0 for c in df.columns), lit(True)))
Run Code Online (Sandbox Code Playgroud)

如果您希望谓词列表可能为空.

例如,如果数据如下所示:

df  = sc.parallelize([
    (0, 0, 0), (1, 0, 0),  (0, 1, 0), (0, 0, 1), (1, 1, 1)
]).toDF(["x", "y", "z"])
Run Code Online (Sandbox Code Playgroud)

结果将是:

+---+---+---+
|  x|  y|  z|
+---+---+---+
|  1|  1|  1|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)

  • Zero323 被迫离开这个网站是一个悲剧,因为我真的很想解释它是如何工作的。正是我所需要的 (2认同)