Pyspark复合过滤器,多种条件

时间:2019-01-29 14:55:03

标签: 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)))

基本上,我只是想返回一个新的数据框,“ matchs”,其中前一个数据框“ sdf”中的列属于上述粘贴条件。我已经阅读了其他一些过滤帖子,例如

multiple conditions for filter in spark data frames

PySpark: multiple conditions in when clause

但是我似乎仍然无法正确解决。我想我可以一次对一个条件进行过滤,然后再调用unionall,但我觉得这似乎是更干净的方法。

1 个答案:

答案 0 :(得分:1)

好吧,由于@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))
)