Función de ventana de PySpark para comprobar, basado en una condición, una fila de lag.
Necesitaría tomar (si está presente y es el último) STAT 200.
Me gustaría tomar su fecha solo si es el último estado y para este caso sé cómo hacerlo, está bien.
Pero primero necesito comprobarlo (si no es el último estado) y luego,
si no fuera el último, me gustaría considerar la fecha del último estado como 200 pero solo si el siguiente estado no es menor (por ejemplo, 150 como en el siguiente caso). En este caso no me interesaría considerarlo.
¿Cómo hacerlo en PySpark? Muchas gracias
ID | STAT | TIME |
---|---|---|
1 | 100 | 17/11/2021 |
1 | 200 | 18/11/2021 |
1 | 150 | 19/11/2021 |
1 | 100 | 20/11/2021 |
2 | 200 | 20/11/2021 |
En este caso no quiero considerar el ID 1 (estado 150 < 200). Así que solo tomo el ID 2.
ID | STAT | TIME |
---|---|---|
1 | 100 | 17/11/2021 |
1 | 200 | 18/11/2021 |
1 | 350 | 19/11/2021 |
1 | 400 | 20/11/2021 |
2 | 200 | 20/11/2021 |
En este caso quiero considerar el estado 200 y sus detalles (estado 350> 200 para el ID 1; solo 200 para el ID 2).
¡Gracias por el apoyo!
davy.ai
Con PySpark, puedes lograr esto utilizando las funciones
filter
yorderBy
.Primero, puedes filtrar el dataframe para incluir solo las filas con
STAT
igual a 200:python
df = df.filter(df.STAT == 200)
Luego, puedes ordenar el dataframe por
ID
yTIME
en orden descendente:python
df = df.orderBy(df.ID.desc(), df.TIME.desc())
Finalmente, puedes utilizar las funciones
groupBy
yagg
para obtener el últimoTIME
para cadaID
:python
df = df.groupBy("ID").agg(F.max("TIME").alias("TIME"))
El dataframe resultante contendrá el último
TIME
para cadaID
con unSTAT
igual a 200.