我需要按照另一列的百分位数对列进行排名
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.percent_rank
val df = List((13,3), (12,5), (11,7), (8,8), (4,5), (3,4), (2,1), (1,2), (1,6) ,(1,12)).toDF("val1","val2")
val w = Window.orderBy(df("val1"))
df.select($"val1", $"val2",percent_rank().over(w).alias("val1_percent")).show()
我得到的结果是:
+----+----+------------------+
|val1|val2| val1_percent|
+----+----+------------------+
| 1| 2| 0.0|
| 1| 6| 0.0|
| 1| 12| 0.0|
| 2| 1|0.3333333333333333|
| 3| 4|0.4444444444444444|
| 4| 5|0.5555555555555556|
| 8| 8|0.6666666666666666|
| 11| 7|0.7777777777777778|
| 12| 5|0.8888888888888888|
| 13| 3| 1.0|
+----+----+------------------+
但我想得到的是该列的排名" val2"使用" val1"的百分位数,即在下表中我想得到列" val2_percent":
+----+----+------------------+----------------+
|val1|val2| val1_percent|val2_percent |
+----+----+------------------+----------------+
| 1| 2| 0.0|0.333 |
| 1| 6| 0.0|0.611 |
| 1| 12| 0.0|0.888 |
| 2| 1|0.3333333333333333|0 |
| 3| 4|0.4444444444444444|0.555 |
| 4| 5|0.5555555555555556|0.583 |
| 8| 8|0.6666666666666666|0.666 |
| 11| 7|0.7777777777777778|0.638 |
| 12| 5|0.8888888888888888|0.583 |
| 13| 3| 1.0|0.444 |
+----+----+------------------+----------------+
请注意,在Excel中,它与PERCENTRANK方法配合得很好。您可以这样使用它:PERCENTRANK([val1 all values],[val2的一个值])
编辑: 在Excel中,我将val1的所有值放在A列中,将val2的所有值放在B列中。对于下面的公式= PERCENTRANK(A1:A10,B1),我得到0.333(如果B1 = 2)