问题:
一个 DataFrame 包含用户登录网站的记录。需要确定用户何时活跃,并考虑一个活动周期。如果用户在此周期后再次登录,则其活跃日期将重置。
提出的方法:
使用带有滞后和递归的窗口函数,识别活动周期内的第一次登录或最近一次登录,以确定活跃日期。
Spark 原生解决方案(>= 3.2):
Spark 3.2 及更高版本支持会话窗口。请参阅官方文档以了解使用方法示例。
旧版解决方案(Spark < 3.2):
导入函数:
Window
用于定义窗口coalesce
, datediff
, lag
, lit
, min
, sum
定义窗口:
userWindow
按 user_name
分区,并按 login_date
排序userSessionWindow
按 user_name
和 session
分区查找新会话的开始:
datediff
和 lag
来比较登录日期,并检查是否存在大于活动周期的差距。cast
将结果转换为 bigint
。userWindow
上的 sum
来累积新的会话开始。查找每个会话的最早日期:
withColumn
添加 session
列。userSessionWindow
上的 min
来查找每个会话的最早 login_date
。session
列。示例:
<code class="language-scala"> val df = Seq( ("SirChillingtonIV", "2012-01-04"), ("Booooooo99900098", "2012-01-04"), ("Booooooo99900098", "2012-01-06"), ("OprahWinfreyJr", "2012-01-10"), ("SirChillingtonIV", "2012-01-11"), ("SirChillingtonIV", "2012-01-14"), ("SirChillingtonIV", "2012-08-11") ).toDF("user_name", "login_date") val result = sessionized //sessionized is assumed to be defined elsewhere, this is a crucial part missing from the original .withColumn("became_active", min($"login_date").over(userSessionWindow)) .drop("session") df.show(5) result.show(5)</code>
请注意,示例代码中缺少 sessionized
的定义,这是完成该解决方案的关键部分。 需要根据活动周期和登录日期计算 session
列。 这通常需要一个自定义函数或更复杂的窗口函数逻辑。 完整的解决方案需要补充这部分缺失的代码。
以上是如何使用窗口函数确定 Spark SQL 中的用户活动日期?的详细内容。更多信息请关注PHP中文网其他相关文章!