繁体   English   中英

Pyspark:过滤 dataframe 基于具有许多条件的列表

[英]Pyspark: filter dataframe based on list with many conditions

假设您有一个 pyspark dataframe dfAB列。
现在,您想用许多条件过滤 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM