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
Lepaskan: 2025-01-10 11:09:42
asal
838 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk
  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>
Salin selepas log masuk
  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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan