使用Spark Structured Streaming API对流数据执行groupBy和聚合是相对简单的。
例如,我有一个IOT遥测数据的流数据帧df
。我将其按systemId
和systemState
进行分组,并进行汇总以回答诸如“对于处于状态z的系统y,测量x的平均值和标准偏差是多少?”的问题。此答案再次以流数据帧的形式出现-称为usualDF
。
我想考虑以下几点: “我看到系统y处于状态z,并且测量值x的值为v。是高还是低?”
要回答这个问题,我想使用usualDF
来标准化 df
。
this post中表达了类似的愿望,并认为这种愿望“不可能”。我已经使用Pandas在Python上实现了流式标准化,我知道有可能-Spark中还没有一个即用的功能。>
一个不错的第一步是join两个数据帧。更具体地说,我们需要沿着列df
和usualDF
进行systemId
和systemState
的左外部联接。
结构化的流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
没有时间戳记,我看不出有一种赋予它的清晰方法。
有什么想法或建议吗?
答案 0 :(得分:2)
在structured streaming guide中,他们说:
从Spark 2.3开始,在联接之前不能使用其他非类地图操作。这里是一些无法使用的示例。
在加入之前不能使用流式聚合。
在加入之前,不能在更新模式下使用mapGroupsWithState和flatMapGroupsWithState。”
因此,我的“不错的第一步”是不受支持的。如果可行,我将尝试使用mapGroupWithState
跟踪均值和标准差,并在此处更新代码。