从Spark DataFrame中删除仅满足两个条件的行

时间:2019-01-23 14:54:50

标签: scala apache-spark

我正在使用Scala和Spark。我想从DataFrame中过滤出某些不满足我指定的所有条件的行,同时保留可能仅满足其中一个条件的其他行。

例如:假设我有这个DataFrame

+-------+----+
|country|date|
+-------+----+
|      A|   1|
|      A|   2|
|      A|   3|
|      B|   1|
|      B|   2|
|      B|   3|
+-------+----+

我想过滤出国家A以及日期12,这样预期的输出应该是:

+-------+----+
|country|date|
+-------+----+
|      A|   3|
|      B|   1|
|      B|   2|
|      B|   3|
+-------+----+

如您所见,我仍将日期为B1的国家({1})保留。

我尝试通过以下方式使用2

filter

但是输出过滤掉所有日期1和2,这不是我想要的。

谢谢。

1 个答案:

答案 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