繁体   English   中英

Apache 梁的 ID Window Session

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM