【问题标题】:Apache Spark Structured Streaming for Window Aggregation and Custom Triggering用于窗口聚合和自定义触发的 Apache Spark 结构化流
【发布时间】:2019-06-25 03:15:51
【问题描述】:

假设我有一些模式的流数据如下:

uid: string
ts: timestamp

现在假设数据已按uid 分区(在每个分区中,数据最少,例如小于 1 行/秒)。

我想根据事件时间ts将数据(在每个分区中)放入窗口,然后对每个窗口中的所有元素进行排序(也基于ts),最后应用自定义转换窗口中的每个元素按顺序排列。

Q1:有没有办法获得窗口的聚合视图,但保留每个元素,例如将一个窗口中的所有元素具体化为一个列表?

Q2:如果Q1可以,我想设置一个水印和触发组合,在窗口结束时触发一次,然后要么定期触发,要么每次延迟数据到达时触发。有可能吗?

【问题讨论】:

    标签: apache-spark spark-structured-streaming


    【解决方案1】:

    在我回答问题之前,让我指出,Spark Structured Streaming 提供了KeyValueGroupedDataset.flatMapGroupsWithState(在Dataset.groupByKey 之后)用于任意状态流聚合(带有显式状态逻辑),它为您提供了最大的手动流状态管理。


    Q1:有没有办法获得窗口的聚合视图,但保留每个元素,例如将一个窗口中的所有元素具体化为一个列表?

    这听起来像是一个流式连接,您的左侧是输入流,右侧是聚合流(流式聚合)。这应该是可行的(但没有示例代码,因为我仍然不确定我是否正确理解了您的问题)。

    Q2:如果Q1可以,我想设置一个水印和触发组合,在窗口结束时触发一次,然后要么定期触发,要么每次延迟数据到达时触发。有可能吗?

    使用window 标准函数定义窗口和水印以在适当的时间“关闭”窗口。这也是可行的(但不再举例,因为我不确定这个问题的价值)。

    【讨论】:

    • 谢谢,我已经查看了flatMapGroupsWithState,但它不适用于窗口函数(请参阅stackoverflow.com/questions/45505095/…),我必须实现自己的窗口逻辑,这不会看起来是对的。
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多