![](/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.