Pyspark: фильтровать информационный фрейм на основе списка с множеством условий - PullRequest
1 голос
/ 30 апреля 2020

Предположим, у вас есть фрейм данных pyspark df со столбцами A и B.
Теперь вы хотите отфильтровать фрейм данных со многими условиями.

Условия содержатся в списке of dicts:

l = [{'A': 'val1', 'B': 5}, {'A': 'val4', 'B': 2}, ...]

Фильтрация должна выполняться следующим образом:

df.filter(
( (df['A'] == l[0]['A']) & (df['B'] == l[0]['B']) )
&
( (df['A'] == l[1]['A']) & (df['B'] == l[1]['B']) )
&
...
)

Как это можно сделать с l, содержащим много условий, то есть ручная вставка в условие фильтра не практично?

Я думал об использовании отдельных шагов фильтра, например:

for d in l:
    df = df.filter((df['A'] == d['A']) & (df['B'] == d['B']))

Есть ли более короткий или более элегантный способ сделать это, например, аналогично использованию списочных представлений?
Кроме того, это не работает для OR (|).

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете использовать list of dictionaries для создания sql expression и отправить его на ваш filter all at once.

l = [{'A': 'val1', 'B': 5}, {'A': 'val4', 'B': 2}]
df.show()

#+----+---+
#|   A|  B|
#+----+---+
#|val1|  5|
#|val1|  1|
#|val1|  3|
#|val4|  2|
#|val1|  4|
#|val1|  1|
#+----+---+

df.filter(' or '.join(["A"+"="+"'"+d['A']+"'"+" and "+"B"+"="+str(d['B']) for d in l])).show()

#+----+---+
#|   A|  B|
#+----+---+
#|val1|  5|
#|val4|  2|
#+----+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...