【问题标题】:Scala Spark get sum by time bucket across team spans and keyScala Spark 跨团队跨度和密钥按时间段求和
【发布时间】:2021-11-10 10:03:39
【问题描述】:

我有一个和How to group by time interval in Spark SQL非常相似的问题

但是,我的指标是花费的时间 (duration),所以我的数据看起来像

KEY |Event_Type | duration | Time 
001 |event1     | 10     | 2016-05-01 10:49:51
002 |event2     | 100    | 2016-05-01 10:50:53
001 |event3     | 20     | 2016-05-01 10:50:55
001 |event1     | 15     | 2016-05-01 10:51:50
003 |event1     | 13     | 2016-05-01 10:55:30
001 |event2     | 12     | 2016-05-01 10:57:00
001 |event3     | 11     | 2016-05-01 11:00:01

有没有办法将花费的时间汇总到五分钟的桶中,按键分组,并知道持续时间何时超出桶的界限?

例如,第一行从 10:49:51 开始,到 10:50:01 结束 因此,窗口[2016-05-01 10:45:00.0,2016-05-01 10:50:00.0] 中键 001 的存储桶将获得 8 秒的持续时间(51 秒到 60 秒),而 10:50 到 10:55 将获得 2 秒的持续时间,加上来自其他日志的相关秒数行(第三行 20 秒,第四行 15 秒)。

我想对特定存储桶中的时间求和,但另一个线程上的解决方案 df.groupBy($"KEY", window($"time", "5 minutes")).sum("metric") 将在桶中高估与桶开始重叠的时间戳,并低估后续桶

注意:我的 Time 列也是像 1636503077 这样的 Epoch 时间戳,但如果这样可以更轻松地进行计算,我可以轻松地将其转换为上述格式。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    在我看来,也许您需要通过将持续时间延长到每分钟(或每五分钟)来预处理数据。
    如你所愿,第一行

    001 |event1     | 10     | 2016-05-01 10:49:51
    

    应该转换成

    001 |event1     | 9     | 2016-05-01 10:49:51
    001 |event1     | 1     | 2016-05-01 10:50:00
    

    然后你可以使用火花窗口函数来正确地求和。

    df.groupBy($"KEY", window($"time", "5 minutes")).sum("metric")

    如果您只想知道时间桶的持续时间,这不会改变结果,但会增加记录数。

    【讨论】:

    • 有道理,谢谢!
    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2011-11-24
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多