![](/img/trans.png)
[英]Apache Spark - capturing Kafka data on streaming event to trigger workflow
[英]Event Data Aggregation Using Kafka Streaming
public class UserEvent {
int userId;
long loginTime;
long jobId;
long jobAttachTime;
long jobdetachTime;
long workTime;
long logoutTime;
long activeTime;
EventType eventType;
}
我有一个应用程序,其中基于登录,作业附加,作业分离和注销等用户操作,在Kafka主题上发送事件。 每个事件在UserEvent
对象中都有一些信息以及userId
和eventType
,例如, 登录事件具有loginTime
; 作业附加事件的属性为jobId
, jobAttachTime
。 同样, 注销事件具有属性logoutTime
。 我的要求是在收到每个用户的注销事件后,将所有这些事件中的信息聚合到一个对象中。 这样,在注销事件之后, UserEvent对象将具有loginTime
, logoutTime
,计算出的workTime
, activeTime
等。如何使用Kafka KStreams和/或KTables实现此目的 ?
为了聚合UserEvents,您需要一个键(示例:会话ID)来过滤所有事件中共有的会话。 假设您为每个用户事件附加了sessionID,该ID对于每个会话都是唯一的,但对于在该会话期间发生的所有用户事件而言,都是相同的。
可以通过以下方式使用GroupBy().aggregate()
来实现:( 考虑到您具有与会话ID等效的属性,该属性可以唯一地用作键 )
// Let's say there is a sessionID
KTable<String, UserEvent> userEventSummary = userEvents
.groupBy(event -> event.get("sessionId"))
.aggregate((userEventSummary,userEvent)->{
userEventSummary = userEvent;
if(new!= null){
String loginEvent = new.get("eventType").get("eventName");
if(loginEvent.equals("login")){
userEventSummary.setLoginTime(new.getLoginTime());
}
if(loginEvent.equals("logOut")){
long workTime = Math.abs(userEvent.getLogOutTime()-userEventSummary.getLoginTime());
userEventSummary.setWorkTime(workTime);
userEventSummary.setActiveTime(workTime);
}
}
return userEventSummary;
});
// if default value for logoutTime is 0, filter the user events which don't have logout time yet
KTable<String, UserEvent> loggedOutEventSummary = userEventSummary.filter(event-> event.getLogOutTime()!= 0);
它将为具有注销事件的用户事件过滤的每个用户操作返回汇总状态。
final KStream<Integer, UserEvent> kStream = builder.stream("test-topic");
kStream.groupByKey().aggregate(() -> new UserEvent(),
(Integer userId, UserEvent userEvent, UserEvent userEventSummary) -> {
if (userEvent.getEventType().equals(EventType.LOGIN)) {
// Event Processing logic for Login event
} else if (userEvent.getEventType().equals(EventType.LOGOUT)) {
// Event Processing logic for Logout event
}
return userEventSummary;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.