Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在KSQLDB中实现类似滞后的实现?_Sql_Apache Kafka_Confluent Platform_Ksqldb - Fatal编程技术网

如何在KSQLDB中实现类似滞后的实现?

如何在KSQLDB中实现类似滞后的实现?,sql,apache-kafka,confluent-platform,ksqldb,Sql,Apache Kafka,Confluent Platform,Ksqldb,我最近开始使用ksql,想看看是否有人可以帮助我进行查询设计。问题是,我有一个视频会议应用程序,在这个应用程序中,广播者可以多次启动和暂停流。我想得到该流的总播放时间和总暂停时间。我有一个由开始和暂停时间戳组成的点击流数据。我应该如何去做,以便我可以生成一个优化的视图 非常感谢您的帮助:) 感谢您将活动分组 您需要解决的第一个问题是如何将开始/停止事件分组在一起 很可能,您希望通过某种USER\u ID或其他属性对它们进行分组,这些属性唯一地标识启动/停止流的广播公司 很可能,您还希望通过某种类

我最近开始使用ksql,想看看是否有人可以帮助我进行查询设计。问题是,我有一个视频会议应用程序,在这个应用程序中,广播者可以多次启动和暂停流。我想得到该流的总播放时间和总暂停时间。我有一个由开始和暂停时间戳组成的点击流数据。我应该如何去做,以便我可以生成一个优化的视图

非常感谢您的帮助:)

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

很可能,您希望通过某种
USER\u ID
或其他属性对它们进行分组,这些属性唯一地标识启动/停止流的广播公司

很可能,您还希望通过某种类型的
STREAM\u ID
或其他唯一标识正在播放的流的属性进行分组

这可能足够了,如果您只需要每个广播机构、每个视频的总播放时间。但是,您可能还需要考虑时间。例如,如果我今天看了一个视频,明天再看一次,那是两个观看时段,总共有两个独立的观看时间,还是你不在乎

对事件进行时间分组的一种方法是使用会话窗口。在对数据进行会话化之前,需要定义定义会话的参数。这是一个例子

另一种对事件进行时间分组的方法是使用滚动窗口。这是一个例子

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

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

在编写本文时,这需要一个自定义UDAF(自定义用户定义的聚合函数)

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

这里有一个例子,但是您需要一个自定义UDAF,这已经包括在内了

目前有一个可能很好地服务于您的目的。这增强了该方法,使其能够捕获最后的N值,而不仅仅是最后的1值。很可能,这将在ksqlDB v0.13中发布,如果您有任何开发经验,您可以随时提取代码并在本地进行编译。如果它不符合你的目的,那么你可以把它作为发展自己的目标的起点

当然,这些解决方案需要对源事件流进行正确排序,以便停止事件永远不会出现在关联的播放事件之前

聚合
一旦计算了一对开始/停止事件之间的播放时间,就需要对它们进行聚合。这里有一个。

嗨,Abhimanyu,如果你提供更多的信息,你通常会从社区成员那里得到更多的时间,特别是表明你花了一些时间研究这个问题。嗨,安德鲁,谢谢你的回复。在过去的两个月里,我一直在研究ksql,我对开发没有太多的背景,尤其是java,我来自统计学背景。因此,我想重申我一直坚持的观点:假设一个广播员在下午12点开始播放一个流,在12:05暂停,然后在12:08重新开始,在12:10结束。这里的总播放时间是7分钟,3分钟是暂停时间。为了得到这个数字,我一直在尝试创建两个表,即暂停和播放,使用1秒的窗口滚动捕获此类事件的所有时间戳,然后使用两个表中都存在的计数器减去它们。但我想检查一下它是否具有大规模可扩展性,我预计每天大约有20-30k个实时会话。我不确定我是否遵循了这一点。考虑更新你的问题来包含你所尝试的SQL,采样输入数据和预期/需要的输出。