在Spark DataFrame上移动百分位数



是否有一种干净的方法来计算火花数据框架上的移动百分位数。

我有一个巨大的数据框架,我每15分钟汇总一次,我想计算每个部分的百分位数。

df.groupBy(window(col("date").cast("timestamp"), "15 minutes"))
  .agg(sum("session"),mean("session"),percentile_approx("session", 0.5))
  .show()

错误:找不到:value percentile_approx

因此,我必须计算基本和平均值之类的基本内容,但我需要计算中位数和其他百分位数。

在Spark 2.1?

中是否有一种有效的方法来执行此操作

因为这里没有中值 percenele_approx percentile_approx 函数似乎在API中实现了。

我已经问了这个问题,但是答案并非所有人都同意独特的解决方案。这对我来说很模糊...所以我想知道2017年8月是否有一个很好的解决方案。

当我穿过15分钟的窗户时,我想知道只是硬计算它是否有效而不是近似?

非常感谢您的关注,

有一个下午好!

ps:Scala或Pyspark我不介意,两个都会更大!

好吧,所以我猜我很愚蠢。

我只需要在我以前的想法中添加 calludf percenele_approx 。对不起,分歧

callUDF("percentile_approx", col("session"), lit(0.5))

因此,例如,我想每一分钟汇总两个月的历史数据集:

df.groupBy(window((col("date")/1000).cast("timestamp"), "1 minutes"))
.agg(sum("session"),mean("session"),callUDF("percentile_approx", col("session"), lit(0.5)))
.show()

(Milisecond中的时间戳,因此/1000

如果您不需要滑动(重叠)窗口,则可以使用GroupBy进行操作。AFAIK没有百分位聚合功能,因此您要么需要实现自己的UDAF,要么使用以下方法:

val df = (1 to 100).map( i => (
  i/10, scala.util.Random.nextDouble)
  ).toDF("time","session")
val calcStats = udf((data:Seq[Double]) => {
  (data.sum,
   data.sum/data.size,
   data.sorted.apply(data.size/2) // is ~ median, replace with your desired logic
  )
})
df.groupBy($"time")
  .agg(collect_list($"session").as("sessions"))
  .withColumn("stats",calcStats($"sessions").cast("struct<sum:double,mean:double,median:double>"))
  .select($"time",$"stats.*")
  .orderBy($"time")
  .show
+----+------------------+-------------------+-------------------+
|time|               sum|               mean|             median|
+----+------------------+-------------------+-------------------+
|   0|3.5441618790222287| 0.3937957643358032| 0.3968893251191352|
|   1|3.6612518806543757| 0.3661251880654376| 0.4395039388994335|
|   2| 4.040992655970037|0.40409926559700365| 0.3522214051715915|
|   3| 4.583175830988081| 0.4583175830988081| 0.5800394949546751|
|   4| 3.849409207658501| 0.3849409207658501|0.43422232330495936|
|   5| 5.514681139649785| 0.5514681139649784| 0.6703416471647694|
|   6| 4.890227540935781| 0.4890227540935781| 0.5515164635420178|
|   7|4.1148083531280095|0.41148083531280094| 0.4384132796986667|
|   8| 5.723834881155167| 0.5723834881155166| 0.6415902834329499|
|   9| 5.559212938582014| 0.5559212938582014| 0.6816268800227596|
|  10|0.8867335786067405| 0.8867335786067405| 0.8867335786067405|
+----+------------------+-------------------+-------------------+

最新更新