Spark数据框过滤器问题

时间:2020-06-25 21:13:39

标签: dataframe apache-spark apache-spark-sql

这里来自SQL背景。.我正在使用df1 = spark.read.jdbc将Azure sql中的数据加载到数据帧中。我正在尝试过滤数据以排除满足以下条件的行:

df2 = df1.filter("ItemID <> '75' AND Code1 <> 'SL'")

数据框最终为空,但是当我运行等效的SQL时,它是正确的。当我将其更改为

df2 = df1.filter("ItemID **=** '75' AND Code1 **=** 'SL'") 

它会产生我要过滤掉的行。

删除符合条件的行的最佳方法是什么,以便将其推送到SQL Server? 谢谢

2 个答案:

答案 0 :(得分:2)

在SQL世界中,<>的意思是Checks if the value of two operands are equal or not, if values are not equal then condition becomes true.

在spark sql中,它的等效项是!=。因此,您在过滤器中的sql条件变为-

# A != B -> TRUE if expression A is not equivalent to expression B; otherwise FALSE
df2 = df1.filter("ItemID != '75' AND Code1 != 'SL'")

=在spark sql中与ansi sql具有相同的含义

df2 = df1.filter("ItemID = '75' AND Code1 = 'SL'")

答案 1 :(得分:0)

在pyspark中将 & 运算符与 != 一起使用。

<>已从python3弃用。

Example:

df=spark.createDataFrame([(75,'SL'),(90,'SL1')],['ItemID','Code1'])

df.filter((col("ItemID") != '75') & (col("code1") != 'SL') ).show()

#or using negation
df.filter(~(col("ItemID") == '75') & ~(col("Code1") == 'SL') ).show()

#+------+-----+
#|ItemID|Code1|
#+------+-----+
#|    90|  SL1|
#+------+-----+