使用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)
谢谢它对我有用。