Rumah >pangkalan data >tutorial mysql >Bagaimanakah Fungsi Tetingkap Boleh Mengenalpasti Status Pengaktifan Pengguna dengan Tetapan Semula Tempoh Aktif 5 Hari?

Bagaimanakah Fungsi Tetingkap Boleh Mengenalpasti Status Pengaktifan Pengguna dengan Tetapan Semula Tempoh Aktif 5 Hari?

Susan Sarandon
Susan Sarandonasal
2025-01-10 11:09:42880semak imbas

How Can Window Functions Identify User Activation Status with a 5-Day Active Period Reset?

Menggunakan Fungsi Tetingkap Spark untuk Menentukan Aktiviti Pengguna dengan Keadaan Kompleks

Contoh ini menunjukkan cara menggunakan fungsi tetingkap Spark untuk menentukan status pengaktifan pengguna, dengan mengambil kira tempoh aktif 5 hari yang ditetapkan semula apabila log masuk berikutnya. Kami diberi DataFrame log masuk pengguna dan bertujuan untuk menambah lajur yang menunjukkan apabila setiap pengguna menjadi aktif.

Metodologi: Memanfaatkan Fungsi Tetingkap

Pendekatan kami menggunakan fungsi tetingkap untuk mengenal pasti peristiwa log masuk yang mencetuskan tetapan semula status aktif. Tetingkap dicipta untuk memesan log masuk mengikut pengguna dan tarikh. Ketinggalan tetingkap ini membolehkan perbandingan antara masa log masuk semasa dan sebelumnya.

<code class="language-scala">import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val window = Window.partitionBy("user_name").orderBy("login_date")
val df2 = df.withColumn("previous_login", lag("login_date", 1).over(window))</code>

Mengatasi Tetapan Semula Status Aktif

Tarikh became_active ditentukan dengan menyemak sama ada log masuk sebelumnya ( previous_login ) jatuh dalam tempoh aktif 5 hari. Jika previous_login batal (log masuk pertama) atau perbezaan masa (login_date - previous_login) adalah kurang daripada 5 hari, became_active ditetapkan kepada login_date semasa. Jika tidak, proses berterusan secara rekursif sehingga syarat ini dipenuhi.

Pelaksanaan Spark (Versi >= 3.2)

Spark 3.2 dan kemudian menawarkan sokongan tetingkap sesi asli, memudahkan tugas ini (lihat dokumentasi rasmi untuk butiran).

Pelaksanaan Spark (Versi Lama)

Untuk versi Spark yang lebih lama, penyelesaian diperlukan:

  1. Tentukan tetingkap untuk pembahagian pengguna dan pengenalan sesi:
<code class="language-scala">val userWindow = Window.partitionBy("user_name").orderBy("login_date")
val userSessionWindow = Window.partitionBy("user_name", "session")</code>
  1. Kenal pasti titik permulaan sesi berdasarkan jurang log masuk:
<code class="language-scala">val newSession = (coalesce(
  datediff($"login_date", lag($"login_date", 1).over(userWindow)),
  lit(0)
) > 5).cast("bigint")</code>
  1. Buat DataFrame sesi dan cari tarikh log masuk paling awal dalam setiap sesi:
<code class="language-scala">val sessionized = df.withColumn("session", sum(newSession).over(userWindow))
val result = sessionized
  .withColumn("became_active", min($"login_date").over(userSessionWindow))
  .drop("session")</code>

Contoh Output

Output berikut menunjukkan hasil menggunakan set data sampel:

<code>+----------------+----------+-------------+
|       user_name|login_date|became_active|
+----------------+----------+-------------+
|  OprahWinfreyJr|2012-01-10|    2012-01-10|
|SirChillingtonIV|2012-01-04|    2012-01-04|
|SirChillingtonIV|2012-01-11|    2012-01-11|
|SirChillingtonIV|2012-01-14|    2012-01-11|
|SirChillingtonIV|2012-08-11|    2012-08-11|
|Booooooo99900098|2012-01-04|    2012-01-04|
|Booooooo99900098|2012-01-06|    2012-01-04|
+----------------+----------+-------------+</code>

Atas ialah kandungan terperinci Bagaimanakah Fungsi Tetingkap Boleh Mengenalpasti Status Pengaktifan Pengguna dengan Tetapan Semula Tempoh Aktif 5 Hari?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn