结构化流式聚合而无需分组

时间:2018-04-21 20:05:05

标签: apache-spark pyspark aggregate-functions spark-structured-streaming

对于一个项目,我们需要分析可能存在异常的流量价格(市场数据)。我们要求在特定时间段内输入价格的“平均值”和“标准差”。

我们的方法是使用“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聚合,然后分析每个价格。

所以问题是:在没有分组数据的情况下,是否有可能进行聚合?如果没有,没有使用内存输出可能还有其他方法吗?

我们也开始质疑“结构化流媒体”是否是我们用例的正确解决方案。

非常感谢提前!

0 个答案:

没有答案