开发者社区> 问答> 正文

Flink SQL sum() over() 函数要3条以上数据才会触发计算吗?

环境说明:flink 1.15 on yarn 模式,消费kafka的数据

sql 如下:
select vin,forwardtime,fault_name,fault_value,
SUM(1) OVER(PARTITION BY vin,fault_name
ORDER BY forwardtime) as rn_sum
from temp_vhr_monitor_activity_alarm_direction

情况说明:
上面sql用到了sum() over() 函数,当第一条数据来的时候发现没有触发计算,第二条数据来的时候也没有触发计算,第三条数据来了发现触发计算了,这种是怎么回事啊?是flink的BUG还是哪里有问题?

展开
收起
游客fuzojzpl5x2bu 2023-08-24 15:52:04 281 0
5 条回答
写回答
取消 提交回答
  • 在Flink的SQL中,SUM() OVER()函数应该在第一条数据到达时就会触发计算,并且每次输入新的数据都会重新计算。因此,根据您提供的情况说明,如果第一条和第二条数据都没有触发计算,可能是由于其他原因导致的问题。

    以下是可能导致这种情况的一些常见原因:

    1. 数据流延迟:如果数据流存在延迟,即数据在进入Flink之前有一段时间的等待,那么在这段时间内SUM() OVER()函数可能不会立即触发计算。只有当第三条数据到达时,之前的两条数据才会被纳入计算范围。

    2. Flink配置问题:检查一下Flink的配置文件是否符合预期。特别是关于窗口或水印设置的配置,可能会影响到SUM() OVER()函数的计算触发。确保配置正确并满足需求。

    3. 数据乱序:如果数据流中存在乱序的情况,即数据的顺序与事件发生的实际顺序不一致,那么可能会导致SUM() OVER()函数的触发条件无法满足。在这种情况下,您可以尝试使用事件时间(Event Time)语义以及适当的Watermark策略来解决乱序问题。

    2023-08-25 08:36:43
    赞同 展开评论 打赏
  • 在Flink SQL中,SUM() OVER()函数是一个窗口聚合函数,它可以在窗口范围内计算每一条数据的累计和。SUM() OVER()函数并不需要3条以上的数据才会触发计算,而是会随着输入流的到达逐渐进行计算。

    根据您提供的SQL语句和情况说明,可能有以下几个原因导致您观察到的情况:

    1. 水位线(Watermark)问题:Flink处理事件时间(Event Time)时,会使用水位线来推进时间的进展。如果未正确设置水位线或未满足水位线的条件,可能导致数据被延迟处理。请确保在消费Kafka数据时,已经正确设置了事件时间和水位线的相关配置。

    2. 排序字段问题:您的SQL语句中使用了ORDER BY forwardtime,按照forwardtime字段进行排序。如果数据的forwardtime值没有严格递增的顺序,可能会导致计算结果出现延迟。请检查数据是否按照正确的顺序到达。

    3. 数据量问题:虽然SUM() OVER()函数理论上可以对每一条数据进行累计求和,但是实际计算的效率和吞吐量与数据量大小有关。如果数据量很大,可能需要一定数量的数据才能触发计算。这取决于Flink的流处理机制和任务配置。您可以尝试适当调整窗口大小或其他相关参数,以满足实际需求。

    2023-08-24 21:53:54
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    Flink SQL中的SUM() OVER()函数在计算窗口聚合时需要满足某个特定条件才会触发计算。这个条件通常是基于窗口规则或窗口的触发器来确定的。

    在你提供的SQL语句中,没有指定任何窗口规则或触发器,因此默认情况下,Flink将按照无界流处理的方式进行计算。在无界流处理中,Flink需要根据数据到达的顺序和条件来确定触发计算的时机。

    具体而言,对于SUM() OVER()函数在无界流处理中,它将根据输入数据的排序和分区规则来触发计算。当输入数据满足分区和排序相关的条件时,Flink会触发计算并输出结果。

    根据你的描述,第一条和第二条数据来时并没有触发计算,这可能是由于数据未满足排序和分区条件。只有当第三条数据到达且满足排序和分区条件时,Flink才会触发计算并输出结果。

    2023-08-24 19:03:05
    赞同 展开评论 打赏
  • CSDN全栈领域优质创作者,万粉博主;InfoQ签约博主;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

    不是的,Flink SQL sum() over() 函数不需要等待3条以上数据才会触发计算。sum() over() 函数会在每个分区内对每个时间窗口内的数据进行累加计算。只要有足够的数据进入分区,Flink就会对分区内的数据进行计算。因此,无论有多少数据进入分区,sum() over() 函数都会在每个时间窗口内立即计算。
    如果您的数据集很小,可能会出现计算结果不准确的情况,因为在计算时,Flink需要等待足够的数据来计算每个时间窗口内的累加值。在这种情况下,您可以考虑增加数据量,或者调整时间窗口的大小,以便更快地收集足够的数据进行计算。

    2023-08-24 17:22:10
    赞同 展开评论 打赏
  • Flink SQL的窗口函数(包括SUM() over()函数)的计算是延迟的,只有在窗口被完全定义后才会进行计算。这意味着,如果一个窗口在开始时没有足够的数据来定义它,那么对应的数据条目将不会包含在结果中。

    在你的例子中,SUM(1) OVER(PARTITION BY vin,fault_name ORDER BY forwardtime)这个窗口函数是基于vin和fault_name进行分区,并按照forwardtime进行排序的。这意味着,只有当至少有3条具有相同vin和fault_name的数据记录,且它们的forwardtime按照规定的顺序排列时,窗口函数才会开始计算。

    所以,你在第一条和第二条数据来的时候没有看到触发计算,是因为窗口还没有被完全定义。直到第三条数据来的时候,窗口已经有了足够的数据来定义,所以这个时候触发了计算。

    这并不是Flink的BUG,而是这种设计允许Flink更有效地处理大规模的数据流。如果窗口函数在每一条数据来的时候就立即计算,那么计算量和资源消耗会非常大,尤其是在有大量数据的情况下。

    如果你希望在每一条数据来的时候就立即进行计算,那么你可能需要调整你的数据处理逻辑或者使用其他的数据处理工具或库。

    2023-08-24 16:02:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Flink CDC Meetup PPT - 龚中强 立即下载
Flink CDC Meetup PPT - 王赫 立即下载
Flink CDC Meetup PPT - 覃立辉 立即下载