从事件流中查找事件的子序列

时间:2016-06-20 12:06:59

标签: apache-spark pyspark spark-streaming

我在下面给出了我的问题的缩影版

我有2个不同的传感器发送1/0值作为流。我能够使用Kafka消耗流并将其带入处理的火花。请注意我在下面给出的示例流。

时间--------------> 1 2 3 4 5 6 7 8 9 10

传感器名称 - > A A B B B B A B A A

传感器值---> 1 0 1 0 1 0 0 1 1 0

我想识别此流中出现的子序列模式。例如,如果A = 0并且流中的下一个值(基于时间)是B = 1,那么我想要发送警报。在上面的示例中,我突出显示了两个地方 - 我想要发出警报。一般来说,它会像

  

“如果在一个时间间隔内发生一组传感器 - 事件组合,   提醒警报“。

我是新手,不知道斯卡拉。我目前正在使用python进行编码。

我的实际问题包含更多传感器,每个传感器可以有不同的值组合。意思是我的子序列和事件流

我已经尝试过几个选项而没有成功

  • 窗口函数 - 可用于移动平均累积和 等不是这个用例
  • 将spark Dataframes / RDD带到本地python结构,如list 和熊猫Dataframes并做分测序 - 它需要很多 在一些迭代后排队的shuffle和spark事件流
  • UpdateStatewithKey - 尝试了几种方法但无法理解 完全如何工作以及这是否适用于此用途 情况下。

1 个答案:

答案 0 :(得分:0)

任何想解决这个问题的人都可以使用我的解决方案:

1- 为了让他们保持联系,您需要使用 collect_list 收集事件。

2- 最好在 collect_list 上对您的事件进行排序,但要小心,因为它按第一列排列数据,因此将 DateTime 放在该列中很重要。

3- 例如,我从 collect_list 中删除了 DateTime。

4- 最后,您应该联系所有元素以使用字符串函数(如包含以查找您的子序列)来探索它。

.agg(expr("array_join(TRANSFORM(array_sort(collect_list((Time , Sensor Value))), a -> a.Time ),'')")as "MySequence")

在这个 agg 函数之后,您可以使用任何正则表达式或字符串函数来检测您的模式。

查看此链接以获取有关 collect_list 的更多信息: collect list 检查此链接以获取有关对 collect_list 进行排序的更多信息: sort a collect list