Pyspark:基于具有许多条件的列表过滤数据框

时间:2020-04-30 14:04:41

标签: python dataframe pyspark

假设您有一个带有列dfA的pyspark数据框B
现在,您要过滤具有许多条件的数据框。

条件包含在字典列表中

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 个答案:

答案 0 :(得分:2)

您可以使用 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|
#+----+---+