对于一个项目,我们需要分析可能存在异常的流量价格(市场数据)。我们要求在特定时间段内输入价格的“平均值”和“标准差”。
我们的方法是使用“Structured Streaming”API。问题是:我们必须在每个窗口聚合AVG / STTDEV,但之后我们需要自己分析每个价格。所以分组是“窗外”。算法的其余部分足够简单,可以使用UDF。
我们已经尝试过:
读取流两次,在第一个表上进行聚合并将其与另一个表连接: 没有用,因为显然你在加入之前不能聚合。
使用内存输出并进行下面的计算: 工作但我们很快就遇到了记忆问题。
我们也尝试使用“任意有状态”方法,但我们不知道这是否是此问题的“正确解决方案”,我们也无法正确实施。
我们的第二个选项代码如下(主要来自编程指南):
val lines = spark.readStream
.format("socket")
.option("host", "localhost")
.option("port", 9998)
.load()
val words = lines.select(split($"value", ",")(0).cast("int").as("Seq_Nr"),
split($"value", ",")(1).cast("int").as("VN"),
split($"value", ",")(5).as("VAS"),
split($"value", ",")(6).cast("float").as("Price"),
split($"value", ",")(11).cast("timestamp").as("timestamp"))
val wordCounts = words.select(window($"timestamp", "5 seconds", "5 seconds"), $"Seq_Nr", $"VN", $"VAS", $"Price", $"timestamp")
val streamingETLQuery = wordCounts
.writeStream
.queryName("counts")
.format("memory")
.outputMode("complete")
.start()
val df = spark.sql("select * from counts")
"Do aggregations and anomaly detection algorithm on DF"
目标是:在“时间戳”上创建一个窗口,为AVG / STDDEV聚合,然后分析每个价格。
所以问题是:在没有分组数据的情况下,是否有可能进行聚合?如果没有,没有使用内存输出可能还有其他方法吗?
我们也开始质疑“结构化流媒体”是否是我们用例的正确解决方案。
非常感谢提前!