[英]Pyspark: filter dataframe based on list with many conditions
假设您有一个 pyspark dataframe df
与A
和B
列。
现在,您想用许多条件过滤 dataframe。
条件包含在字典列表中:
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 (|)。
您可以使用您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|
#+----+---+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.