Spark SQL-Fensterfunktionen und komplexe Bedingungen
Angenommen, Sie haben einen DataFrame mit Benutzeranmeldedaten und möchten eine Spalte hinzufügen, um deren Aktivierungsdatum auf der Website anzugeben. Es gibt jedoch eine Einschränkung: Der Aktivitätszeitraum eines Benutzers läuft nach einer bestimmten Zeit ab und durch eine erneute Anmeldung wird sein Aktivierungsdatum zurückgesetzt.
Dieses Problem kann mithilfe von Fensterfunktionen in Spark SQL gelöst werden. Hier ist eine Möglichkeit:
Schritt 1: Definieren Sie das Fenster
<code>import org.apache.spark.sql.expressions.Window import org.apache.spark.sql.functions._ val userWindow = Window.partitionBy("user_name").orderBy("login_date") val userSessionWindow = Window.partitionBy("user_name", "session")</code>
Schritt 2: Erkennen Sie den Beginn einer neuen Sitzung
<code>val newSession = (coalesce( datediff($"login_date", lag($"login_date", 1).over(userWindow)), lit(0) ) > 5).cast("bigint") val sessionized = df.withColumn("session", sum(newSession).over(userWindow))</code>
Schritt 3: Finden Sie den frühesten Termin für jede Sitzung
<code>val result = sessionized .withColumn("became_active", min($"login_date").over(userSessionWindow)) .drop("session")</code>
Diese Methode verwendet ein Schiebefenster, um die Daten nach Benutzer zu unterteilen und nach Anmeldedatum zu sortieren. Definieren Sie dann das Sitzungsfenster, indem Sie Zeilen mit derselben Sitzungs-ID gruppieren. Das gewünschte Ergebnis kann erreicht werden, indem erkannt wird, wann eine neue Sitzung beginnt (newSession) und das früheste Anmeldedatum in jeder Sitzung berechnet wird (became_active).
Neueste Spark-Verbesserungen
Für Spark 3.2 und höher werden Sitzungsfenster nativ unterstützt, was die obige Lösung noch einfacher macht. Einzelheiten finden Sie in der offiziellen Dokumentation.
Das obige ist der detaillierte Inhalt vonWie können Spark SQL-Fensterfunktionen Benutzeraktivierungsdaten mit sitzungsbasiertem Ablauf bestimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!