Quero filtrar um quadro de dados com base nas consultas processadas do usuário, no entanto, o número de condições não é constante e mudará de usuário para usuário. Por exemplo, vamos supor que dois usuários terão as seguintes condições diferentes
1- df.filter( ( col('A') == 'book' ) & (col('B') == '1') & (col('C') == '0') )
2- df.filter( ( col('A') == 'film') ) & (col('B') == '0'))
Uma solução é cascatear as condições sequencialmente
for k,v in argList:
df = df.filter(col(k) == v)
onde argList é uma lista de condições por usuário, por exemplo [('A','book') ,('B','1'), ('C','0')]
ou [('A','film') ,('B','0')]
.....
Existe uma maneira melhor de cascatear várias condições sem repetir todas as condições?
Não há nada de errado em percorrer as condições, pois o otimizador do Spark combinará todos os filtros em um único:
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()
estampas
== Physical Plan ==
*(1) Filter (((isnotnull(A#0L) AND isnotnull(B#1L)) AND (A#0L = 1)) AND (B#1L = 4))
+- *(1) Scan ExistingRDD[A#0L,B#1L]
e apenas uma operação de filtro é executada.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras