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

pma*_*a93 2 scala apache-spark

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

例如:假设我有这个 DataFrame

+-------+----+
|country|date|
+-------+----+
|      A|   1|
|      A|   2|
|      A|   3|
|      B|   1|
|      B|   2|
|      B|   3|
+-------+----+
Run Code Online (Sandbox Code Playgroud)

并且我想过滤掉国家/地区A和日期12,以便预期的输出应该是:

+-------+----+
|country|date|
+-------+----+
|      A|   3|
|      B|   1|
|      B|   2|
|      B|   3|
+-------+----+
Run Code Online (Sandbox Code Playgroud)

如您所见,我仍然B使用日期12.

我尝试filter按以下方式使用

df.filter("country != 'A' and date not in (1,2)")
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

DNA*_*DNA 5

你现在的情况是

df.filter("country != 'A' and date not in (1,2)")
Run Code Online (Sandbox Code Playgroud)

可以翻译为“接受除A以外的任何国家,然后接受除1或2之外的任何日期”。您的条件是独立应用的

你想要的是:

df.filter("not (country = 'A' and date in (1,2))")
Run Code Online (Sandbox Code Playgroud)

即“查找国家 A 和日期为 1 或 2 的行,并拒绝它们”

或等效地:

df.filter("country != 'A' or date not in (1,2)")
Run Code Online (Sandbox Code Playgroud)

即“如果国家不是 A,那么无论日期如何都接受它。如果国家是 A,那么日期不能是 1 或 2”

德摩根定律

not(A or B) = not A and not B

not (A and B) = not A or not B