我有大量的时间序列数据,我想使用spark的并行处理/分布式计算进行数据处理。 要求是逐行查看数据以确定在期望结果部分下指定的组,如果没有执行者之间的某种协调,我真的无法获得分配它的动力。
t- timeseries datetime sample,
lat-latitude,
long-longitude
例如:用一小部分示例数据集来解释这种情况
t lat long
0 27 28
5 27 28
10 27 28
15 29 49
20 29 49
25 27 28
30 27 28
Lat-long interval
(27,28) (0,10)
(29,49) (15,20)
(27,28) (25,30)
使用这段代码,我可以获得预期的结果
val spark = SparkSession.builder().master("local").getOrCreate()
import spark.implicits._
val df = Seq(
(0, 27,28),
(5, 27,28),
(10, 27,28),
(15, 26,49),
(20, 26,49),
(25, 27,28),
(30, 27,28)
).toDF("t", "lat","long")
val dfGrouped = df
.withColumn("lat-long", struct($"lat", $"long"))
val wAll = Window.partitionBy().orderBy($"t".asc)
dfGrouped.withColumn("lag", lag("lat-long", 1, null).over(wAll))
.orderBy(asc("t")).withColumn("detector", when($"lat-long" === $"lag", 0)
.otherwise(1)).withColumn("runningTotal", sum("detector").over(wAll))
.groupBy("runningTotal", "lat-long").agg(struct(min("t"), max("t")).as("interval"))
.drop("runningTotal").show
}
但是如果数据进入两个执行器,那么数据将像
t lat long
0 27 28
5 27 28
10 27 28
15 29 49
20 29 49
25 27 28
t lat long
30 27 28
我应该如何获取大量数据的期望输出。必须有更聪明的方法来做到这一点,并在执行者之间进行某种形式的协调,以得到结果。
请指导我正确的方向,我已经进行了相同的研究,但未能找到解决方案。
PS:这只是一个示例。
答案 0 :(得分:-1)
您可以使用UDAF解决此问题。 首先,您可以添加一个列,该列代表在您拥有的许多执行程序中划分的t列。像executorIndex = t%((max(t)-min(t))/ numExecutors)之类的东西。
然后,您可以按executorIndex应用UDAF分组。
您的UDAF需要存储一个带有字符串键(例如)的Map,该键表示一对经纬度对,而int []则表示此经纬度键的maxT和minT。
请询问您是否需要更详细的说明。
希望获得帮助...
PS:我想说的是,同一纬度和经度之间存在时间关系,如果您正在跟踪某些运动,这是正常现象...