2016-08-10 7 views
1

Ich habe folgende Daten:Wie Daten filtern Fensterfunktionen in Funken mit

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 so filtern, dass ich die Zeilen 6 und 7 für eine bestimmte uid entfernen ich möchte nur eine Zeile mit dem Wert ‚c‘ Code halten

also die erwarteten Daten sein sollten:

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 Fensterfunktion so etwas wie dies mit:

val window = Window.partitionBy("uid").orderBy("time") 
val change = ((lag("code", 1).over(window) <=> "c")).cast("int") 

Dies würde uns helfen, jede Zeile mit einem Code "c" zu identifizieren. Kann ich diese erweitern Reihen heraus filtern die erwarteten Daten zu erhalten

+0

können Sie Ihre Anforderung klären? Ist es so, dass Sie für jede UID nur eine Zeile für jeden Code behalten möchten oder nur für den Code "c", den Sie dafür benötigen? – mattinbits

Antwort

1

Wenn Sie nur die Zeilen, in denen Code entfernen möchten = „c“ (mit Ausnahme der ersten für jede uid) Sie folgendes versuchen könnte:

val window = Window.partitionBy("uid", "code").orderBy("time") 
val result = df 
    .withColumn("rank", row_number().over(window)) 
    .where(
    (col("code") !== "c") || 
    col("rank") === 1 
) 
    .drop("rank") 

Bearbeiten neuer Informationen:

val window = Window.partitionBy("uid").orderBy("time") 
val result = df 
    .withColumn("lagValue", coalesce(lag(col("code"), 1).over(window), lit(""))) 
    .where(
    (col("code") !== "c") || 
    (col("lagValue") !== "c") 
) 
    .drop("lagValue") 
+1

Bei Verwendung des obigen Codes, wenn ich partitionBy ("UID", "Code") tun, ist der resultierende Datensatz falsch, da dies das folgende Ergebnis ergibt: Rowid-UID-Timecode – hbabbar

+0

@hbabbar, warum ist es falsch? –

+0

Leider verpasst den gesamten Kommentar Hochladen .. So Der resultierende df ist so etwas wie:. auf den obigen Code, wenn ich das tue val Fenster = Window.partitionBy ("uid", "Code") orderBy (. "Zeit") df.withColumn ("Rang", row_number() über (Fenster)) die resultierende Datenmenge ist falsch, da dies das folgende Ergebnis liefert: rowid uid Zeitcode Rang 1 1 5 a 1 4 2 8 a 2 2 1 6 b 1 3 1 7 c 1 5 2 9 c 1 Daher verliere ich auf th e Gruppierung auf uid – hbabbar