我正在使用Scala和Spark。我想从DataFrame中过滤出某些不满足我指定的所有条件的行,同时保留可能仅满足其中一个条件的其他行。
例如:假设我有这个DataFrame
+-------+----+
|country|date|
+-------+----+
| A| 1|
| A| 2|
| A| 3|
| B| 1|
| B| 2|
| B| 3|
+-------+----+
我想过滤出国家A
以及日期1
和2
,这样预期的输出应该是:
+-------+----+
|country|date|
+-------+----+
| A| 3|
| B| 1|
| B| 2|
| B| 3|
+-------+----+
如您所见,我仍将日期为B
和1
的国家({1})保留。
我尝试通过以下方式使用2
filter
但是输出过滤掉所有日期1和2,这不是我想要的。
谢谢。
答案 0 :(得分:2)
您当前的状况是
df.filter("country != 'A' and date not in (1,2)")
,可以翻译为“接受A以外的任何国家,然后接受除1或2之外的任何日期”。您的条件将独立应用
您想要的是:
df.filter("not (country = 'A' and date in (1,2))")
即“找到国家A和日期为1或2的行,并拒绝它们”
或等效地:
df.filter("country != 'A' or date not in (1,2)")
即“如果国家/地区不是A,则无论日期如何,都接受。如果国家/地区为A,则日期不能为1或2”
请参见supertype:
not(A或B)=不是A也不是B
不是(A和B)=不是A还是不是B