是否有一种干净的方法来计算火花数据框架上的移动百分位数。
我有一个巨大的数据框架,我每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|
+----+------------------+-------------------+-------------------+