我有一个用例,我们需要在窗口内的数据中查找模式。我们正在试验结构化流。我们有一个连续的事件流,正在寻找类似事件 A(设备断开连接)在 10 秒内紧接着事件 B(设备重新连接)的模式。或者事件 A(断开连接)在 10 秒内没有跟随事件 B(重新连接)。
我正在考虑使用窗口函数将数据集分组到 10 秒的窗口桶中,并在每次更新窗口值时检查模式。看起来窗口函数确实在结构化流中用作 groupBy,这迫使我使用聚合函数来获取列值的高级聚合。
我想知道在结构化流中使用窗口函数时是否有一种方法可以遍历列的所有值。
最佳答案
您可能想尝试使用 mapGroupsWithState(结构化流)或 mapWithState(DStreams),听起来它很适合您的情况。
您可以为任何键保留任意状态,并在每次更新到来时更新状态。您还可以为每个键设置超时,之后其状态将被删除。对于您的用例,您可以将事件 A 的初始状态存储为 A 到达的时间戳,当事件 B 到达时,您可以检查时间戳是否在 A 的 10 秒内。如果是,则生成一个事件。
您也可以为此使用超时,例如设置A来时的初始状态,设置超时时间为10s,如果B来时A还在,则产生事件。
Good blog post关于黑白 mapGroupsWithState 和 mapWithState 的区别
关于apache-spark - 在 Spark 结构化流中获取窗口的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906717/