我正在尝试从数据框架中过滤记录,而这些记录不是从多个列中等于(!=(值。我能够使它起作用,但在解释过滤器的工作方式时遇到麻烦。
问题语句
- 带有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,因此您可以指定多个值。