使用一列的百分位数被另一列

时间:2017-05-24 11:40:45

标签: apache-spark apache-spark-sql percentile

我需要按照另一列的百分位数对列进行排名

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)

0 个答案:

没有答案