使用Spark结构化流媒体进行流媒体标准化

时间:2018-09-27 18:18:32

标签: apache-spark pyspark left-join normalization spark-structured-streaming

使用Spark Structured Streaming API对流数据执行groupBy和聚合是相对简单的。

例如,我有一个IOT遥测数据的流数据帧df。我将其按systemIdsystemState进行分组,并进行汇总以回答诸如“对于处于状态z的系统y,测量x的平均值和标准偏差是多少?”的问题。此答案再次以流数据帧的形式出现-称为usualDF

我想考虑以下几点: “我看到系统y处于状态z,并且测量值x的值为v。是高还是低?”

要回答这个问题,我想使用usualDF来标准化 dfthis post中表达了类似的愿望,并认为这种愿望“不可能”。我已经使用Pandas在Python上实现了流式标准化,我知道有可能-Spark中还没有一个即用的功能。

一个不错的第一步是join两个数据帧。更具体地说,我们需要沿着列dfusualDF进行systemIdsystemState的左外部联接。 结构化的流API支持流数据帧的左外部联接,但需要水印。我收到以下错误:

org.apache.spark.sql.AnalysisException: Append output mode not supported when there are streaming aggregations on streaming DataFrames/DataSets without watermark;;

更改输出模式会产生:

org.apache.spark.sql.AnalysisException: Stream-stream outer join between two streaming DataFrame/Datasets is not supported without a watermark in the join keys, or a watermark on the nullable side and an appropriate range condition;;

`

虽然df有时间戳记,并且可能带有水印,但usualDF没有时间戳记,我看不出有一种赋予它的清晰方法。

有什么想法或建议吗?

1 个答案:

答案 0 :(得分:2)

structured streaming guide中,他们说:

  

从Spark 2.3开始,在联接之前不能使用其他非类地图操作。这里是一些无法使用的示例。

     
    

在加入之前不能使用流式聚合。

         

在加入之前,不能在更新模式下使用mapGroupsWithState和flatMapGroupsWithState。”

  

因此,我的“不错的第一步”是不受支持的。如果可行,我将尝试使用mapGroupWithState跟踪均值和标准差,并在此处更新代码。