Spark结构化流:如何合并新数据和结果

时间:2018-08-20 05:32:32

标签: apache-spark merge spark-structured-streaming

我正在使用Spark来处理流数据,并且需要将新数据与已处理数据进行合并,例如,我已经对数据进行了分组和排序:

val groups = data
.groupBy("room_ID").agg(sort_array(collect_list(struct($"room_date",$"readout"))).as("subRecord"))

组:

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  id  | subRecord                                                                                                                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  1   |[[2013-12-14 00:00:00, 10], [2013-12-14 01:00:00, 15], [2013-12-14 02:00:00, 20], [2013-12-14 03:00:00,  5], [2013-12-14 04:00:00, 30], [2013-12-14 05:00:00, 35]]|
|  2   |[[2013-12-14 00:00:00, 30], [2013-12-14 01:00:00, 35], [2013-12-14 02:00:00, 45], [2013-12-14 03:00:00, 55], [2013-12-14 04:00:00, 65], [2013-12-14 05:00:00, 70]]|
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

我需要删除id:1的记录[2013-12-14 03:00:00, 5],这意味着我必须将每个点与周围的点进行比较,所以我使用udf来做到这一点

val clearNoise:UserDefinedFunction = udf(
//do clear noise
)
val result = groups.withColumn("cleard",clear($"subRecord"))

结果:

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  id  | cleard                                                                                                                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  1   |[[2013-12-14 00:00:00, 10], [2013-12-14 01:00:00, 15], [2013-12-14 02:00:00, 20], [2013-12-14 04:00:00, 30], [2013-12-14 05:00:00, 35]]|
|  2   |[[2013-12-14 00:00:00, 30], [2013-12-14 01:00:00, 35], [2013-12-14 02:00:00, 45], [2013-12-14 03:00:00, 55], [2013-12-14 04:00:00, 65], [2013-12-14 05:00:00, 70]]|
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

我的问题是,新数据到来时会触发再次处理所有数据吗?如果是的话,如何将新数据和每个id的最新2点合并到结果中而又不再次处理旧数据?换句话说,最后一批的输出就是下一批的输入。

1 个答案:

答案 0 :(得分:0)

我假设您将为您的新数据创建一个新文件。 如果两个RDD具有相同的结构,则可以将现有RDD与要使用新文件创建的新RDD进行连接。

val MergedRDD = result.union(newRDD)

这会将两个RDD的结果合并为一个,而无需再次处理旧数据。

但是,如果传入数据正在流式传输,则最好使用DStream

最好输入流数据。