Gewusst wie: filtern von Daten mithilfe von Fenster-Funktionen in der Funke
Habe ich folgende Daten :
rowid uid time code
1 1 5 a
2 1 6 b
3 1 7 c
4 2 8 a
5 2 9 c
6 2 9 c
7 2 10 c
8 2 11 a
9 2 12 c
Nun wollte ich die Daten filtern, die in einer Weise, die ich kann entfernen Sie die Zeilen 6 und 7 für einen bestimmten uid ich will einfach eine Zeile mit dem Wert 'c' im code
Also die zu erwartenden Daten sollten sein :
rowid uid time code
1 1 5 a
2 1 6 b
3 1 7 c
4 2 8 a
5 2 9 c
8 2 11 a
9 2 12 c
Ich bin mit der Fenster-Funktion, so etwas wie dieses :
val window = Window.partitionBy("uid").orderBy("time")
val change = ((lag("code", 1).over(window) <=> "c")).cast("int")
Dies würde uns dabei helfen, jede Zeile mit dem code 'c'. Verlängere ich diese heraus zu filtern und Zeilen, um die erwarteten Daten
- Können Sie klären Ihre Anforderung? Ist es der Fall, dass für jede UID, die Sie behalten möchten nur eine Zeile für jeden code, oder ist nur für code "c", das Sie brauchen, um dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, entfernen Sie nur die Zeilen, in denen code = "c" (außer der ersten für jede uid) können Sie Folgendes versuchen:
Bearbeiten, basierend auf neuen Informationen:
df.withColumn("rank", row_number().over(window)).where( (col("code") !== "c") || col("rank") === 1 ).drop("rank")
.orderBy("rowid")
oder.orderBy("uid", "rowid")