Pyspark数据框过滤器或条件

时间:2019-04-11 12:41:48

标签: python dataframe pyspark conditional-statements

我正在尝试根据如下OR条件过滤pyspark数据框:

filtered_df = file_df.filter(file_df.dst_name == "ntp.obspm.fr").filter(file_df.fw == "4940" | file_df.fw == "4960")

我只想返回file_df.fw ==“ 4940”或file_df.fw ==“ 4960”的行 但是,当我尝试此操作时,出现此错误:

Py4JError: An error occurred while calling o157.or. Trace:
py4j.Py4JException: Method or([class java.lang.String]) does not exist

我在做什么错?

没有OR条件,当我尝试仅根据一种条件(file_df.fw=="4940")进行过滤时,它会起作用

1 个答案:

答案 0 :(得分:1)

该错误消息是由操作员的不同优先级引起的。 |(OR)作为比较运算符==具有更高的优先级。 Spark尝试将OR应用于
"4940"file_df.fw,而不希望您在(file_df.fw == "4940")(file_df.fw == "4960")上使用它。您可以使用方括号更改优先级。看下面的例子:

columns = ['dst_name','fw']

file_df=spark.createDataFrame([('ntp.obspm.fr','3000'),
                               ('ntp.obspm.fr','4940'),
                               ('ntp.obspm.fr','4960'),
                               ('ntp.obspm.de', '4940' )],
                              columns)

#here I have added the brackets
filtered_df = file_df.filter(file_df.dst_name == "ntp.obspm.fr").filter((file_df.fw == "4940") | (file_df.fw == "4960"))
filtered_df.show()

输出:

+------------+----+ 
|    dst_name|  fw| 
+------------+----+ 
|ntp.obspm.fr|4940| 
|ntp.obspm.fr|4960| 
+------------+----+