рассчитать z-оценку для каждой строки в столбце данных, используя scala / spark - PullRequest
0 голосов
/ 01 марта 2020

У меня есть фрейм данных:

val DF = {spark.read.option("header", value = true).option("delimiter", ";").csv(path_file)}

val cord = DF.select("time","longitude", "latitude","speed")

Я хочу рассчитать показатель z (среднее значение x) / стандартное отклонение для каждой строки столбца скорости. Я рассчитываю среднее и стандартное отклонение:

val std = DF.select(col("speed").cast("double")).as[Double].rdd.stdev()
val mean = DF.select(col("speed").cast("double")).as[Double].rdd.mean()

Как рассчитать z-оценку для каждой строки скорости столбца и получить такой результат:

+----------------+----------------+-   
|A               |B               |speed    |   z score      
+----------------+----------------+---------------------+
|17/02/2020 00:06|      -7.1732833|   50    |    z score     

|17/02/2020 00:16|      -7.1732833|   40    |    z score   

|17/02/2020 00:26|      -7.1732833|   30    |    z score

Как рассчитать его для каждой строки.

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Вы можете избежать двух отдельных действий RDD, используя оконные функции и STDDEV_POP из агрегатных функций Hive:

val DF = {spark.read.option("header", value = true).option("delimiter", ";").csv(path_file)}

val cord = DF.select($"time",$"longitude", $"latitude",$"speed".cast("double"))

val result = cord
  .withColumn("mean",avg($"speed").over())
  .withColumn("stddev",callUDF("stddev_pop",$"speed").over())
  .withColumn("z-score",($"speed"-$"mean")/$"stddev") 
0 голосов
/ 01 марта 2020

Лучший способ сделать это:

df.withColumn("z score", col("speed") - mean / std)

, где среднее и стандартное значение рассчитываются, как показано в вопросе.

Дайте мне знать, если это поможет !!

...