【问题标题】:Get all rows of a window in Spark structured streaming在 Spark 结构化流中获取窗口的所有行
【发布时间】:2017-10-09 22:37:45
【问题描述】:

我有一个用例,我们需要在窗口中查找数据中的模式。我们正在试验结构化流。我们有一个连续的事件流,并且正在寻找诸如事件 A(设备断开连接)在 10 秒内跟随事件 B(设备重新连接)的模式。或者事件 A(断开连接)在 10 秒内没有跟随事件 B(重新连接)。

我正在考虑使用窗口函数将数据集分组到 10 秒窗口桶中,并在每次更新窗口值时检查模式。看起来窗口函数真的被用作结构化流中的 groupBy ,这迫使我使用聚合函数来获取列值的高级聚合。

我想知道在结构化流中使用窗口函数时是否有一种方法可以遍历列的所有值。

【问题讨论】:

  • 您是否找到了无需分组的方法?我有一个类似的用例,我不想执行高级聚合,而是在窗口上获取事件并像上面提到的那样执行 CEP。
  • @BiplobBish 没有。我最终改用 dstream 并按键分组。
  • 感谢您的回复,这正是我们现在想做的事情。如果这不能像我们预期的那样工作,我们可能很快就会转向 Flink CEP。无论如何感谢您的回复。

标签: apache-spark spark-structured-streaming


【解决方案1】:

您可能想尝试使用 mapGroupsWithState(结构化流)或 mapWithState(DStreams),听起来它可以很好地满足您的情况。

您可以为任何键保留任意状态,并在每次更新时更新状态。您还可以为每个键设置超时,之后其状态将被删除。对于您的用例,您可以将事件 A 的初始状态存储为 A 到达的时间戳,当事件 B 到来时,您可以检查时间戳是否在 A 的 10 秒内。如果是,则生成一个事件。

您也可以为此使用超时,例如设置A来时的初始状态,设置超时时间为10s,如果B来时A还在,则生成事件。

Good blog post 关于 mapGroupsWithState 和 mapWithState 的区别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2019-10-23
    • 1970-01-01
    • 2017-07-12
    • 2020-12-15
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多