我正在使用Spark 2.3结构化流,并尝试使用“滞后”功能。但是,看起来结构化流式传输不支持滞后。
val output = spark.sql("SELECT temperature, time, lag(temperature, 1) OVER (ORDER BY time) AS PrevTemp FROM InputTable")
出现此错误:
org.apache.spark.sql.AnalysisException: Non-time-based windows are not supported on streaming DataFrames/Datasets; line 1 pos 0;
是否有另一种方法可以通过结构化流媒体实现这种“滞后”功能?
谢谢!
答案 0 :(得分:0)
据我所知没有。
可能您可以使用mapGroupsWithState。例如:
case class PayLoad(event_time: java.sql.Timestamp, data: String)
def mappingFunction(key: java.sql.Timestamp, values: Iterator[PayLoad], state: GroupState[PayLoad]): PayLoad = {
??? // Work with values iterator
}
val temperature: DataFrame = ???
temperature
.withColumn("event_time", org.apache.spark.sql.functions.current_timestamp())
.as[PayLoad]
.groupByKey(_.event_time)
.mapGroupsWithState(GroupStateTimeout.ProcessingTimeTimeout())(mappingFunction)
您不需要保持状态,但是通过这种方式,您可以访问值迭代器,并且能够解决任何任务。
请记住,在这种情况下,所有微批处理数据都将进入一个分区,并且具有巨大的有效负载可能会导致巨大的延迟甚至OOM。 (以及OVER (ORDER BY time)
)
希望有帮助。