Удалить строки из Spark DataFrame, которые ТОЛЬКО удовлетворяют двум условиям - PullRequest
0 голосов
/ 23 января 2019

Я использую 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 и 2.

Я пытался использовать filter следующим образом

df.filter("country != 'A' and date not in (1,2)")

Но выходные данные отфильтровывают все даты 1 и 2, а это не то, что я хочу.

Спасибо.

1 Ответ

0 голосов
/ 23 января 2019

Ваше текущее состояние

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)")

т.е. «Если страна не А, то примите ее независимо от даты. Если страна А, то дата не должна быть 1 или 2»

См. Законы де Моргана :

не (A или B) = не A и не B

не (A и B) = не A или не B

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...