Fungsi tetingkap Spark SQL dan keadaan kompleks
Andaikan anda mempunyai DataFrame yang mengandungi butiran log masuk pengguna dan anda ingin menambah lajur untuk menunjukkan tarikh pengaktifan mereka di tapak web. Walau bagaimanapun, terdapat kaveat: tempoh aktiviti pengguna tamat selepas tempoh masa tertentu, dan log masuk semula akan menetapkan semula tarikh pengaktifan mereka.
Masalah ini boleh diselesaikan menggunakan fungsi tetingkap dalam Spark SQL. Berikut ialah satu cara:
Langkah 1: Tentukan tetingkap
<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>
Langkah 2: Kesan permulaan sesi baharu
<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>
Langkah 3: Cari tarikh paling awal untuk setiap sesi
<code>val result = sessionized .withColumn("became_active", min($"login_date").over(userSessionWindow)) .drop("session")</code>
Kaedah ini menggunakan tetingkap gelongsor untuk membahagikan data mengikut pengguna dan mengisihnya mengikut tarikh log masuk. Kemudian tentukan tetingkap sesi dengan mengumpulkan baris dengan ID sesi yang sama. Keputusan yang diingini boleh dicapai dengan mengesan apabila sesi baharu bermula (newSession) dan mengira tarikh log masuk paling awal dalam setiap sesi (menjadi_aktif).
Peningkatan Spark terkini
Untuk Spark 3.2 dan ke atas, tetingkap sesi disokong secara asli, menjadikan penyelesaian di atas lebih mudah. Lihat dokumentasi rasmi untuk butiran.
Atas ialah kandungan terperinci Bagaimanakah Fungsi Spark SQL Window Menentukan Tarikh Pengaktifan Pengguna dengan Tamat Tempoh Berasaskan Sesi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!