如何在 Spark 中找到连续条目的平均值
Posted
技术标签:
【中文标题】如何在 Spark 中找到连续条目的平均值【英文标题】:How to find mean of successive entries in Spark 【发布时间】:2016-10-07 11:08:24 【问题描述】:我有一个数据框,其数值与此类似:
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 万,因此这是一个挑战。
有什么替代方法吗?
【问题讨论】:
【参考方案1】: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|
+-----+
但您必须手动添加范围边界。
【讨论】:
以上是关于如何在 Spark 中找到连续条目的平均值的主要内容,如果未能解决你的问题,请参考以下文章