如何映射Spark数据集分区元素?

时间:2016-11-10 17:09:06

标签: scala apache-spark

我有一个事件日志条目列表,如下所示:(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
}

问题是这段代码需要所有一天的事件才能工作,但这应该没问题,因为文件已经像这样分区了。然而,火花仍在进行大量的改组。有更好的方法吗?

谢谢!

0 个答案:

没有答案