如何在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,以此类推…

我用下面的方法来使用窗口函数:

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

import 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|
+-----+

相关内容

  • 没有找到相关文章

最新更新