[英]ID of Apache Beam Window Session
I am gathering TableRows
into apache beam session windows and want to add each row some kind of a session id after its session is determined.
此代码对会话进行分区:
PCollection<TableRow> rows = ...; // "rows" looks like {{"id":1}, {"id":2}, {"id":3}}
PCollection<TableRow> sessionWindowedRows = rows.apply(
Window.<TableRow>into(Sessions.withGapDuration(Duration.standardSeconds(300))));
我想要这样的东西:
PCollection<TableRow> rows = ...; // "rows" looks like {{"id":1}, {"id":2}, {"id":3}}
PCollection<TableRow> sessionWindowedRows = rows.apply(
Window.<TableRow>into(Sessions.withGapDuration(Duration.standardSeconds(300))))
.apply("adding session id to table row", ParDo.of(new DoFn<TableRow, TableRow>() {
@ProcessElement
public void processElement(ProcessContext ctx) {
TableRow row = ctx.element();
row.put("sessionId", Sessions.getSessionOf(row); // Sessions.getSessionOf(row) IS NOT A REAL FUNCTION
ctx.output(row);
}
}));
所以最后rows
看起来像
{{"id":1, "sessionId":lastSessionId1}, {"id":2, "sessionId":lastSessionId2}, {"id":3, "sessionId":lastSessionId3}}
我发现的最好的是关于自定义 windows 的 apache 光束 文档,但我无法从中了解如何做我想做的事。
在您的@ProcessElement
function 中,您可以定义BoundedWindow类型的参数。 从中您可以获得元素分配的 window 的maxTimestamp()
; 从而从中创建一个 sessionId 。
@ProcessElement
public void processElement(ProcessContext ctx, BoundedWindow window) {
TableRow row = ctx.element();
row.put("sessionId", "session_" + window.maxTimestamp().toString());
ctx.output(row);
}
我支持 Iñigo 的断言,即除非您进行聚合,否则您不需要 session window (或任何窗口)。 我想这发生在你管道的其他地方?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.