我不熟悉Spark结构化流处理,目前正在研究一个用例,其中结构化流应用程序将从Azure IoT中心-事件中心(例如,每20秒之后)获取事件。
任务是消耗这些事件并实时处理它。为此,我在Spark-Java中编写了以下Spark结构化流程序。
以下是重点
问题:
...
SELECT JSON_OBJECT('post_id', T1.post_id, 'user_id', T1.user_id,
JSON_ARRAYAGG(
JSON_OBJECT('post_id', T2.post_id, 'saved_name', T2.saved_name,
GROUP_CONCAT(T2.saved_name ORDER BY T2.post_id ASC)))) AS 'file_Name'
FROM posts AS T1 INNER JOIN files AS T2 ON T1.post_id = T2.post_id
group by T1.post_id ORDER BY created_date DESC
...
对此的任何帮助或指导都将很有用。
感谢和问候,
Avinash Deshmukh
答案 0 :(得分:0)
是否可以根据窗口时间将多个事件以拼写格式存储在文件中?
是的
在这种情况下,窗口操作如何工作?
以下代码是Spark结构化流应用程序的主要部分:
Dataset<Row> devWindowDataset = messageDataset
.withWatermark("eventDate", "10 minutes")
.groupBy(
functions.col("deviceID"),
functions.window(functions.col("eventDate"), "10 minutes", "5 minutes"))
.count();
这表示基础状态存储区应保持每个deviceID
和eventDate
的状态10分钟,并保留额外的10 minutes
(每个withWatermark
的状态以延迟事件。换句话说,一旦事件在流式查询开始后eventDate
20分钟后,您就会看到结果出来。
withWatermark
用于后期事件,因此即使groupBy
会产生结果,也只有在超过水印阈值时才会发出结果。
并且每10分钟(加上10分钟的水印)和5分钟的窗口幻灯片执行相同的程序。
将groupBy
与window
运算符一起考虑为多列聚合。
我还要检查上一个事件的事件状态,并根据一些计算(例如5分钟未收到事件),我想更新状态。
这听起来像是KeyValueGroupedDataset.flatMapGroupsWithState运算符的用例(又名任意有状态流聚合)。请咨询Arbitrary Stateful Operations。
也可能只需要众多aggregation standard functions或user-defined aggregation function (UDAF)之一。