我有一个数据帧,它的数值类似于:
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")
这个方法有两个问题:
- 不能在数据帧的第一个和最后一个位置分别添加0和1 这不是很有效。我的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|
+-----+