在Spark流中聚合来自不同微批次的数据

时间:2017-04-20 07:11:48

标签: apache-spark pyspark apache-spark-sql spark-streaming spark-dataframe

我正在尝试使用Spark流媒体(从Kafka读取)每分钟聚合并找到一些指标。我能够汇总该特定分钟的数据。如何确保我当天可以拥有一个桶并总结当天所有会议记录的总值?

我有一个数据框,我正在做类似的事情。

sampleDF = spark.sql("select userId,sum(likes) as total from likes_dataset group by userId order by userId")

2 个答案:

答案 0 :(得分:1)

您可以使用" Watermarking"结构化流编程的功能

示例代码

import spark.implicits._

val words = ... // streaming DataFrame of schema { timestamp: Timestamp, word: String }

    val windowedCounts = words
        .withWatermark("timestamp", "10 minutes")
        .groupBy(
            window($"timestamp", "10 minutes", "5 minutes"),
            $"word")
        .count()

答案 1 :(得分:1)

我弄明白发生了什么。我在Spark中了解了状态流,这对我有所帮助。

我所要做的就是,

running_counts = countStream.updateStateByKey(updateTotalCount, initialRDD=initialStateRDD) 

我必须写这个updateTotalCount函数来说明如何将旧聚合数据与微批量的新聚合数据合并。就我而言,更新功能如下所示:

def updateTotalCount(currentCount, countState):
    if countState is None:
       countState = 0
    return sum(currentCount) + countState