如何找到 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")
所以这种方法有两个问题:
- 无法分别在数据帧的第一个和最后一个位置附加 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
导入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|
+-----+
但您必须手动添加范围边界。
我有一个数据框,其数值与此类似:
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")
所以这种方法有两个问题:
- 无法分别在数据帧的第一个和最后一个位置附加 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
导入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|
+-----+
但您必须手动添加范围边界。