想要在火花中的不相等(!=)过滤条件上说明



我正在尝试从数据框架中过滤记录,而这些记录不是从多个列中等于(!=(值。我能够使它起作用,但在解释过滤器的工作方式时遇到麻烦。

问题语句

  • 带有ID和值列的DataFrame
  • 仅过滤记录没有id = 1 and 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|
+---+------+

以"one_answers":

输出

它正在删除具有ID = 4的另一个记录= 4且Value = value1 ..基本上它正在删除所有记录,value!=value1。

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

问题:

最初,我尝试使用"one_answers"状态,例如"df.filter("(id != 1 and value != 'Value1')").show",但它不起作用

我的理解是因为它是两个条件(id not equal 1 and value not equal Value1)的组合,因此应该是AND但奇怪的是,它可以与OR内部的条件一起使用。

有人可以解释这种行为,以及如何解释这一点。Sry如果这是SQL语法问题

逻辑上的问题语句将被解释

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

,您希望将其返回所有行不将两个值匹配在一起。分组很重要

该语句可以逻辑地翻译成

id!=1 or value!="Value1" 

这称为de Morgans法律,并解释了您所看到的

您可以在Java中执行类似的操作(在Python,Scala中类似(,

ds = ds.filter(functions.not(functions.col(colName).isin(exclusionSet)).
filter(functions.not(functions.col(colName).isin(exclusionSet2));

,然后继续添加尽可能多的过滤器。

functions.not方法不包括指定的值集。.isin方法接受任何对象或SEQ,因此您可以指定多个值。

最新更新