假设您有一个带有列df
和A
的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(|)。
答案 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|
#+----+---+