Mi entrada es un marco de datos Spark:

EventTime,Signal
0,-65
10,-63
20,-71
40,-65
50,-62
80,-81
90,-84
100,-81
...
85460,-71
85480,-66
85490,-89
85500,-80

Me gustaría obtener la media de la señal por cada 900 segundos de EventTime, la salida se ve así:

EventTime, MeanSignal
0, mean 
900, mean 
1800, mean
...
85500, mean

Mi problema es que no hay un paso regular de EventTime en los datos regulares, por lo que no puedo dividir el marco de datos en partes de la misma longitud ...

0
SimbaPK 16 oct. 2018 a las 12:40

2 respuestas

La mejor respuesta

Ok, aquí está mi solución, gracias a otras publicaciones: creé una columna Bucket asociada al módulo de EventTime para crear categorías, y luego agrupe por cubos y tomo la media

    val df = data_input.withColumn("Bucket", toBucketUDF(col("EventTime")))

    val finalDF = df.groupBy("Bucket")
      .agg(mean("RSSI"))
      .withColumnRenamed("avg(RSSI)", "RSSI")
      .orderBy("Bucket")
      .withColumn("EventTime", getTimeUDF(col("Bucket")))
      .drop("Bucket")



    finalDF

  }

  def toBucket(input:Int): Int = {
    val Bucket = input/900
    return Bucket
  }
  def getTime(input: Int): Int = {
    val time = (input+1) * 900
    return time
  }

  val toBucketUDF = udf(toBucket _)
  val getTimeUDF = udf(getTime _)
0
SimbaPK 18 oct. 2018 a las 09:24

Puede agregar una nueva columna como EventTime / 900 y agrupar según esa columna. Algo como esto.

val map = Map(0 -> -65 , 10 -> -63 , 20 -> -71 , 40 -> -65 , 50 -> -62 , 80 -> -81 , 90 -> -84 , 100 -> -81 , 85460 -> -71 , 85480 -> -66 , 85490 -> -89 , 85500 -> -80)

val df = map.toSeq.toDF("EventTime", "Signal")
  .withColumn("EventTimeGrp", (col("EventTime")/lit(900)).cast("int"))
  .groupBy("EventTimeGrp").agg(mean("Signal").as("MeanSignal"))
  .withColumn("EventTime", col("EventTimeGrp")*lit(900))
  .drop("EventTimeGrp")

Los resultados se ven así. EventTime 0 representa valores entre 0-899 y así sucesivamente.

+------------------+---------+ | MeanSignal|EventTime| +------------------+---------+ |-75.33333333333333| 84600| | -71.5| 0| | -80.0| 85500| +------------------+---------+

0
Apurba Pandey 17 oct. 2018 a las 03:07