Spark结构化流中的滞后函数

时间:2018-07-20 17:39:09

标签: apache-spark spark-streaming

我正在使用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;

是否有另一种方法可以通过结构化流媒体实现这种“滞后”功能?

谢谢!

1 个答案:

答案 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)

希望有帮助。