首页 > 解决方案 > 使用 Spark 结构化流的窗口化滞后/增量

问题描述

首先,我对火花很陌生,如果我错过了明显的东西,请道歉!

我正在使用 Spark 开发 POC,它使用来自 Apache Kafka 的数据流。我的第一个目标是使用 Spark 中的“窗口”功能很简单的一般移动平均线,并根据一些键计算一些平均值。

我的下一个目标是计算自上一个窗口以来的“增量”。因此,如果我有一个参数调用“噪声”,则“窗口”函数会计算 avg(noise)。但我还想包括当前窗口与前一个窗口之间的 avg(noise) 增量。

我尝试使用该lag功能,但它看起来不像是应该的:

Non-time-based windows are not supported on streaming DataFrames/Datasets

我的问题是,Spark Structure Streaming 是否提供了一些开箱即用的计算方法?我已经考虑过使用MapGroupsWithStateFunction我认为可能可行的方法,但是如果有一种显然更可取的内置方法。

我的代码是:

WindowSpec w = Window.partitionBy(functions.col("window.start"), functions.col("keyName")).orderBy(functions.col("window.start"));

Dataset<Row> outputDS = inputDataset.withWatermark("timeStamp", "1 days")
        .groupBy(functions.col("keyName"), functions.window(functions.col("timeStamp"), "1 hours", "1 hours"))
        .avg("noise").withColumn("delta", functions.lag("avg(noise)", 1).over(w));

标签: apache-sparkspark-structured-streaming

解决方案


推荐阅读