Хотелось бы пояснить условие неравного (! =) Фильтра в Spark - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь отфильтровать записи из фрейма данных, которые не равны (! =) Значениям из нескольких столбцов.Я могу заставить его работать, но не могу понять, как работает фильтр ..

Постановка проблемы

  • Кадр данных со столбцом идентификатора и значения
  • Фильтровать записикоторый не имеет id = 1 и value = 'Value1'

Я могу решить эту проблему, используя следующий код

val conf = new SparkConf().setAppName("Test").setMaster("local[4]")    
val spark = org.apache.spark.sql.SparkSession.builder().config(conf).getOrCreate()    
import spark.implicits._

val df = Seq((1, "Value1"),(2, "Value2"), (3, "Value3"), (4, "Value1"), (5, "Value2"), (6, "Value3")).toDF("id", "value")    
df.filter("(id != 1 or value != 'Value1')").show

Вывод с "ИЛИ":

+---+------+
| id| value|
+---+------+
|  2|Value2|
|  3|Value3|
|  4|Value1|
|  5|Value2|
|  6|Value3|
+---+------+

Вывод с «И»:

Удаляется другая запись с id = 4 и значением = Значение1. По сути, это удаление всех записей со значением! = Значение1.

+---+------+
| id| value|
+---+------+
|  2|Value2|
|  3|Value3|
|  5|Value2|
|  6|Value3|
+---+------+

Вопрос:

Первоначально я пытался с условием "И" внутри фильтра, например "df.filter("(id != 1 and value != 'Value1')").show", но оно не работало

Насколько я понимаю, это комбинация двухусловие (id not equal 1 and value not equal Value1) и, следовательно, оно должно быть AND, но, как ни странно, оно работает с условием OR внутри фильтра.

Может кто-нибудь объяснить это поведение и как его следует интерпретировать.Sry, если это вопрос синтаксиса SQL

1 Ответ

1 голос
/ 11 мая 2019

Оператор задачи будет логически интерпретирован

not (id = 1 and value = 'Value1') 

И вы ожидаете, что это вернет все строки, не соответствующие обоим значениям вместе.Группировка важна

Это утверждение можно логически перевести на

id!=1 or value!="Value1" 

Это называется Закон де Моргана и объясняет, что вы видите

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