我试图找到一种方法来计算给定数据帧的中位数.
val df = sc.parallelize(Seq(("a",1.0),("a",2.0),("a",3.0),("b",6.0), ("b", 8.0))).toDF("col1", "col2")
+----+----+
|col1|col2|
+----+----+
| a| 1.0|
| a| 2.0|
| a| 3.0|
| b| 6.0|
| b| 8.0|
+----+----+
现在我想做那样的事情:
df.groupBy( “COL1”).AGG(calcmedian( “COL2”))
结果应如下所示:
+----+------+
|col1|median|
+----+------+
| a| 2.0|
| b| 7.0|
+----+------+`
因此calcmedian()必须是UDAF,但问题是,UDAF的“evaluate”方法只需要一行,但我需要整个表来对值进行排序并返回中位数…
// Once all entries for a group are exhausted, spark will evaluate to get the final result
def evaluate(buffer: Row) = {...}
这有可能吗?或者还有另一个不错的解决方法吗?我想强调