如何使用Spark流检测时间序列数据的变化

时间:2016-11-14 09:37:34

标签: time-series spark-streaming

我在Kafka有一个连续的数据流。我想计算数据流中列值发生变化的次数。

我应该使用哪种算法?

2 个答案:

答案 0 :(得分:0)

在带有Structured Streaming的Spark 2.0中,处理流式DataFrame非常接近普通的DataFrame。在以下测试示例中,当添加新批次数据时,值计数将打印到控制台。

我们还可以创建自己的StreamSinkProvider,以决定在有新批次数据时该怎么做。

val wordCounts = words.groupBy("value").count()
val query = wordCounts.writeStream
  .outputMode("complete")
  .format("console")
  .start()

然后使用以下代码来使用class CustomSinkProvider extends StreamSinkProvider { def createSink( sqlContext: SQLContext, parameters: Map[String, String], partitionColumns: Seq[String], outputMode: OutputMode): Sink = { new Sink { override def addBatch(batchId: Long, data: DataFrame): Unit = { // Do something. } } } }

CustomSinkProvider

答案 1 :(得分:0)

这是您要找的东西吗? 将先前的值与当前值进行比较,并过滤掉当前等于先前的情况。在此之后做一个计数。

    case class TimeSeriesEntry(
      key: String,
      timestamp: Instant,
      value: Long
    )
    val timeSeriesData: Dataset[TimeSeriesEntry] = null
    timeSeriesData
      .groupByKey(_.key)
      .mapGroups { (k, timeSeriesEntries: Iterator[TimeSeriesEntry]) =>
        val last = timeSeriesEntries.next()
        if (!timeSeriesEntries.hasNext) {
          (k, true)
        } else {
          val secondLast = timeSeriesEntries.next()
          (k, last != secondLast)
        }
      }.filter {
      _._2
    }.groupByKey(_._1)
      .count()