Pyspark 如何在Spark中级联未知数量的条件而不循环遍历每个条件
我想根据已处理的用户查询过滤数据帧,但是条件的数量不是恒定的,并且会随着用户的不同而变化。例如,假设两个用户具有以下不同的条件Pyspark 如何在Spark中级联未知数量的条件而不循环遍历每个条件,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我想根据已处理的用户查询过滤数据帧,但是条件的数量不是恒定的,并且会随着用户的不同而变化。例如,假设两个用户具有以下不同的条件 1- df.filter( ( col('A') == 'book' ) & (col('B') == '1') & (col('C') == '0') ) 2- df.filter( ( col('A') == 'film') ) & (col('B') == '0')) 一种解决方案是按顺序级联条件 for k,v in argList:
1- df.filter( ( col('A') == 'book' ) & (col('B') == '1') & (col('C') == '0') )
2- df.filter( ( col('A') == 'film') ) & (col('B') == '0'))
一种解决方案是按顺序级联条件
for k,v in argList:
df = df.filter(col(k) == v)
其中argList是每个用户的条件列表,例如
[('A','book'),('B','1'),('C','0')]
或[('A','film'),('B','0')]
有没有更好的方法来级联多个条件而不循环遍历每个条件?循环遍历条件没有什么错,因为Spark Optimizer会将所有过滤器合并为一个过滤器:
df=spark.createDataFrame([(1,2)、(1,4)、(5,6)],['A','B']
df=df.filter(F.col('A')==1)
df=df.filter(F.col('B')==4)
df.explain()
印刷品
==物理计划==
*(1) 过滤器((isnotnull(A#0L)和isnotnull(B#1L))以及(A#0L=1)和(B#1L=4))
+-*(1)扫描现有RDD[A#0L,B#1L]
并且只执行一个过滤操作