使用scala/spark计算数据帧列中每一行的z分数

使用scala/spark计算数据帧列中每一行的z分数,scala,apache-spark,hypothesis-test,Scala,Apache Spark,Hypothesis Test,我有一个数据帧: val DF = {spark.read.option("header", value = true).option("delimiter", ";").csv(path_file)} val cord = DF.select("time","longitude", "latitude","speed") 我想计算速度列每行的z分数(x-平均值)/std。我计算平均值和标准偏差: val std = DF.select(col("speed").cast("double")

我有一个数据帧:

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

val cord = DF.select("time","longitude", "latitude","speed")
我想计算速度列每行的z分数(x-平均值)/std。我计算平均值和标准偏差:

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

如何为每行计算它。

执行此操作的最佳方法是:

df.withColumn("z score", col("speed") - mean / std)
其中,平均值和标准差的计算如问题所示


让我知道这是否有帮助

您可以避免使用窗口函数和蜂巢聚合函数中的
STDDEV_POP
两个单独的RDD操作:

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") 

用你的平均值和std计算每行的分数有意义吗?或者你想计算每一行从第一行到当前行的平均值和标准差吗?我想计算每一行的z分数,其平均值和标准差如下(50平均值/标准差)和(40平均值/标准差)……我明白了。然后使用
df.withColumn(“z test”),col(“speed”)-mean/std)
谢谢它对我有用。