Состояние фильтра данных Pyspark ИЛИ условие - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь отфильтровать мой фрейм данных pyspark на основе условия OR следующим образом:

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

Что я делаю не так?

Без условия ИЛИ работает, когда я пытаюсь отфильтровать только одно условие (file_df.fw=="4940")

1 Ответ

1 голос
/ 11 апреля 2019

Сообщение об ошибке вызвано различными приоритетами операторов.| (ИЛИ) имеет более высокий приоритет, чем оператор сравнения ==.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| 
+------------+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...