我正在使用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点合并到结果中而又不再次处理旧数据?换句话说,最后一批的输出就是下一批的输入。
答案 0 :(得分:0)
我假设您将为您的新数据创建一个新文件。 如果两个RDD具有相同的结构,则可以将现有RDD与要使用新文件创建的新RDD进行连接。
val MergedRDD = result.union(newRDD)
这会将两个RDD的结果合并为一个,而无需再次处理旧数据。
但是,如果传入数据正在流式传输,则最好使用DStream
最好输入流数据。