如何在 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 中找到连续条目的平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何计算每天的时间戳条目数

如何在熊猫中获得连续滚动平均值?

Spark SQL 窗口平均值问题

没有 UDF 的 Spark 数据集的加权平均值

如何在 Spark 上平均分配 Beam 任务?

在恒定时间内更新连续数字序列的平均值