【问题标题】:How to find mean of successive entries in Spark如何在 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")

所以我对这种方法有两个问题:

  1. 不能分别在数据帧的第一个和最后一个位置附加 0 和 1
  2. 效率不高。我的 df 中的行数可能会达到 3000 万,因此这是一个挑战。

有什么替代方法吗?

【问题讨论】:

    标签: apache-spark dataframe apache-spark-sql window-functions


    【解决方案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|
    +-----+
    

    但您必须手动添加范围边界。

    【讨论】:

      猜你喜欢
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 2021-03-24
      相关资源
      最近更新 更多