【发布时间】:2021-10-04 18:06:36
【问题描述】:
数据:
from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.getOrCreate()
data = [(1, 8, 1, None),
(1, 1, 8, None),
(2, 1, 8, None),
(2, 8, 8, 9999)]
df = spark.createDataFrame(data, ['c1', 'c2', 'c3', 'c4'])
条件列表:
conditions = [
((F.col('c1') == 2) | (F.col('c2') < 5)),
((F.col('c3') == 1) | F.col('c4').isNotNull())
]
要重写的过滤器:
df = df.filter(conditions[0] & conditions[1])
df.show()
# +---+---+---+----+
# | c1| c2| c3| c4|
# +---+---+---+----+
# | 2| 8| 8|9999|
# +---+---+---+----+
在我的原始数据中,列表中有未定义数量的条件。我正在寻找一种使用 AND 将它们组合在一起的方法,这样我就不需要使用索引号单独引用它们了。
我试过Python的内置all()没有成功:df = df.filter(all(conditions))
ValueError:无法将列转换为布尔值:请使用 '&' 表示 'and'、'|'在构建 DataFrame 布尔表达式时,for 'or', '~' for 'not'。
【问题讨论】:
标签: python apache-spark pyspark apache-spark-sql conditional-statements