时间序列数据火花的数据处理

时间:2018-07-17 06:57:17

标签: scala apache-spark time-series

给出以下示例数据,

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)

1 个答案:

答案 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转换为数据帧,并使用groupByaggregation作为

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] |
+--------+--------+

我希望答案会有所帮助