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:
<code class="language-scala">val userWindow = Window.partitionBy("user_name").orderBy("login_date") val userSessionWindow = Window.partitionBy("user_name", "session")</code>
<code class="language-scala">val newSession = (coalesce( datediff($"login_date", lag($"login_date", 1).over(userWindow)), lit(0) ) > 5).cast("bigint")</code>
<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!