我在Kafka有一个连续的数据流。我想计算数据流中列值发生变化的次数。
我应该使用哪种算法?
答案 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()