给出以下示例数据,
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)
答案 0 :(得分:1)
如果您的数据量巨大,我不会向您建议此解决方案,但是自从您发表评论
我正在处理存储在cassandara中的每日数据,大小为每秒5-6k记录
以下解决方案建议应该没问题
查看给定的数据框,模式应该为
root
|-- t: integer (nullable = false)
|-- lat: integer (nullable = false)
|-- long: integer (nullable = false)
您的预期输出表明,您将需要一个额外的列来对数据框进行分组,这将需要您在一个执行器上收集数据
val collectedRDD = df.collect()
var varianceCount, lattitude, longitude = 0
val groupedData = new ArrayBuffer[(Int, Int, Int, Int)]()
for(rdd <- collectedRDD) {
val t = rdd.getAs[Int]("t")
val lat = rdd.getAs[Int]("lat")
val long = rdd.getAs[Int]("long")
if (lat != lattitude || long != longitude) {
varianceCount = varianceCount + 1
lattitude = lat
longitude = long
groupedData.append((t, lat, long, varianceCount))
}
else {
groupedData.append((t, lat, long, varianceCount))
}
}
然后您将ArrayBuffer转换为数据帧,并使用groupBy
和aggregation
作为
val finalDF = groupedData
.toDF("t", "lat", "long", "grouped")
.groupBy(struct("lat", "long").as("lat-long"), col("grouped"))
.agg(struct(min("t"), max("t")).as("interval"))
.drop("grouped")
finalDF
应该是
+--------+--------+
|lat-long|interval|
+--------+--------+
|[29,49] |[15,20] |
|[27,28] |[0,10] |
|[27,28] |[25,30] |
+--------+--------+
我希望答案会有所帮助