怎样在KSQLDB中实现LAG之类的实现?

时间:2020-08-29 13:25:36

标签: sql apache-kafka confluent-platform ksqldb

我最近开始使用ksql,想检查是否有人可以帮助我进行查询设计。问题陈述是我有一个视频会议应用程序,广播公司可以在其中多次启动和暂停流。我想获取该流的总播放时间和总暂停时间。我有一个包含开始和暂停时间戳的点击流数据。我应该怎么做才能生成优化的视图。

非常感谢您的帮助:)

谢谢

1 个答案:

答案 0 :(得分:1)

分组事件

您需要解决的第一个问题是如何将开始/停止事件分组在一起?

就像,您将希望通过某种USER_ID或其他属性来对它们进行分组,这些属性可以唯一地标识正在启动/停止流的广播公司。

同样,您还希望根据某种STREAM_ID或其他属性来分组,这些属性可以唯一地标识正在播放的流。

这可能就足够了,只要您只需要每个广播者,每个视频的总播放时间即可。但是,您可能还需要考虑时间。例如,如果我今天看一个视频,然后明天再看一次,那是两次观看会议,并且观看时间总计是两个,还是您不在乎?

将事件及时分组的一种方法是使用会话窗口。在会话化数据之前,需要定义定义会话的参数。这是good example of using session windows in ksqlDB

将事件按时间分组的另一种方法是使用滚动窗口。这是good example of using tumbling windows

计算播放时间

对事件进行分组后,您可能需要计算播放时间。例如,如果我在时间5开始播放,在时间8停止播放,那么我观看视频的时间就是5 - 8 = 3

这需要捕获播放事件并等待停止事件,然后输出时间差。并以容错的方式进行一些操作。

在撰写本文时,这将需要自定义UDAF(自定义用户定义的聚合函数)。

自定义UDAF可以捕获开始事件,将其存储以备将来参考,并为播放时间输出“ 0”,然后在看到相应的停止事件时,可以从其状态中删除开始事件,计算播放时间并返回。

这里是good example of writing a custom UDF in ksqlDB,尽管您需要自定义的UDAF,这些内容已覆盖here

目前有一个PR open with an enhancement to the LATEST_BY_OFFSET method可以很好地满足您的目的。这增强了方法,使其可以捕获最后一个N值,而不仅仅是捕获最后一个1值。很有可能,它将在ksqlDB v0.13中发布,如果您有任何开发经验,则始终可以提取代码并在本地进行编译。如果它不能满足您的目的,那么您也许可以将其用作开发自己的起点。

当然,这些解决方案要求您对源事件流进行正确排序,以使停止事件永远不会在与它们相关的播放事件之前出现。

汇总

一旦计算了一对开始/停止事件之间的播放时间,就需要对其进行汇总。这是good example of how to aggregate in ksqlDB