Pyspark复合过滤器,多种条件

Dat*_*Dog 1 pyspark

Pyspark 是全新的,我正在重构一些 R 代码,这些代码开始失去正确扩展的能力。我返回一个数据帧,其中包含许多带有数值的列,并且我尝试使用多个复合条件将此结果集过滤为一个新的、更小的结果集。

from pyspark.sql import functions as f

matches = df.filter(f.when('df.business') >=0.9 & (f.when('df.city') == 1.0) & (f.when('street') >= 0.7)) |
                   (f.when('df.phone') == 1) & (f.when('df.firstname') == 1) & (f.when('df.street') == 1) & (f.when('df.city' == 1)) |
                   (f.when('df.business') >=0.9) & (f.when('df.street') >=0.9) & (f.when('df.city')) == 1))) |
                   (f.when('df.phone') == 1) & (f.when('df.street') == 1) & (f.when('df.city')) == 1))) |
                   (f.when('df.lastname') >=0.9) & (f.when('df.phone') == 1) & (f.when('df.business')) >=0.9 & (f.when('df.city') == 1))) |
                   (f.when('df.phone') == 1 & (f.when('df.street') == 1 & (f.when('df.city') == 1) & (f.when('df.busname') >= 0.6)))
Run Code Online (Sandbox Code Playgroud)

本质上,我只是想返回一个新的数据帧,“匹配”前一个数据帧中的列,“sdf”落入前面粘贴的标准。我读过其他一些过滤帖子,例如

Spark数据框中过滤的多个条件

PySpark:when 子句中的多个条件

但我似乎仍然无法做到正确。我想我可以一次根据一个条件过滤它,然后调用 unionall,但我觉得这似乎是更干净的方法。

cph*_*sto 5

好吧,既然 @DataDog 已经澄清了,所以下面的代码复制了 OP 设置的过滤器。

注意:每个条款/子条款都应位于括号内。如果我错过了,那么这是一个无意的错误,因为我没有数据来测试它。但这个想法仍然是一样的。

matches = df.filter(
                ((df.business >= 0.9) & (df.city ==1) & (df.street >= 0.7))
                                    |
                ((df.phone == 1) & (df.firstname == 1) & (df.street ==1) & (df.city ==1))
                                    |
                ((df.business >= 0.9) & (df.street >= 0.9) & (df.city ==1))
                                    |
                ((df.phone == 1) & (df.street == 1) & (df.city ==1))
                                    |
                ((df.lastname >= 0.9) & (df.phone == 1) & (df.business >=0.9) & (df.city ==1))
                                    |
                ((df.phone == 1) & (df.street == 1) & (df.city ==1) & (df.busname >=0.6))
)
Run Code Online (Sandbox Code Playgroud)