如何找到 Spark 中连续条目的平均值

How to find mean of successive entries in Spark

我有一个数据框,其数值与此类似:

df

probability
0
0.2
0.3
0.4
0.5

我需要找到每个连续条目的概率均值,并需要以下内容

expectedMeanDF

mean
0
0.1
0.25
0.35
0.45
1

其中 0.1 是 0 和 0.2 的平均值,0.25 是 0.2 和 0.3 的平均值,依此类推...

我通过以下方式使用 window 函数来执行此操作:

df.withColumn("partition", dp.col("probability")*0)

val window = Window.partitionBy("partition")
val mean = distinctProbability.withColumn("mean", (newdp.col("probability") + lead("probability", 1).over(window)) / 2).drop("partition").drop("probability")

所以这种方法有两个问题:

  1. 无法分别在数据帧的第一个和最后一个位置附加 0 和 1
  2. 效率不高。我的 df 中的行数可能会增加到 3000 万,所以这是一个挑战。

对此有任何替代方法吗?

3000 万不是一个大数字,因此本地处理可能足够快,但这是不正确的。 partitionBy 导致随机播放,如果没有 orderBy,数据的排列顺序可能与您预期的不同。

我知道的唯一可扩展的解决方案是转换为 RDD:

val df = Seq(0, 0.2, 0.3, 0.4, 0.5).toDF("probability")
val rdd = df.orderBy($"probability").as[Double].rdd

导入RDDFunctions

import org.apache.spark.mllib.rdd.RDDFunctions._

使用滑动方式:

val slides = rdd.sliding(2).toDS

求均值:

val means = slides.map(slide => slide.sum / slide.size)

并转换回 DataFrame:

means.toDF

它将覆盖所有连续的值:

+-----+
|value|
+-----+
|  0.1|
| 0.25|
| 0.35|
| 0.45|
+-----+

但您必须手动添加范围边界。