我有一个事件日志条目列表,如下所示:(user_id, timestamp)
。这些条目存储在Hive表中,并且已经按时间戳的日期进行了分区。
现在,我想从这些事件中创建会话。会话是属于单个用户的事件的集合。如果30分钟的用户活动存在差距,那么我假设有一个新的会话。所以我有一个看起来像这样的方法:
def sessionize(events: List[TrackingEvent]): Map[Integer, List[UserSession]] = {
val eventsByUser = events.sortWith((a, b) => a.timestamp.before(b.timestamp)).groupBy(_.userId)
val sessionsByUser: MutableMap[Integer, List[UserSession]] = MutableMap()
for ((userId, eventList) <- eventsByUser) {
val sessions: MutableList[UserSession] = MutableList()
for (event <- eventList) {
sessions.lastOption match {
case None => sessions += UserSession.fromEvent(event)
case Some(lastSession) if event.belongsToSession(lastSession) => lastSession.includeEvent(event)
case Some(_) => sessions += UserSession.fromEvent(event)
}
sessionsByUser(userId) = sessions.toList
}
}
sessionsByUser.toMap
}
问题是这段代码需要所有一天的事件才能工作,但这应该没问题,因为文件已经像这样分区了。然而,火花仍在进行大量的改组。有更好的方法吗?
谢谢!