Заменить значение столбца на номер другого значения столбца, меньшего, чем он сам - PullRequest
0 голосов
/ 26 июня 2018

Предположим, у меня есть фрейм данных Pyspark с двумя столбцами: ID, зарплата.Фрейм данных имеет 100 миллионов записей.Я хотел бы заменить зарплату столбца на порядок ранга столбца.В столбце rank-order подсчитано, сколько людей с зарплатой ниже.Как сделать это эффективно

Например, с учетом следующего входного кадра данных:

df = spark.createDataFrame([(1,2000),
                        (2,500),
                        (3,1500)],
                       ['id','salary'])

df.show()

+---+------+
| id|salary|
+---+------+
|  1|  2000|
|  2|   500|
|  3|  1500|
+---+------+

Я бы получил следующий вывод:

results.show()

+---+----------+
| id|rank_order|
+---+----------+
|  1|         2|
|  2|         0|
|  3|         1|
+---+----------+

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Эффективный способ сделать это - использовать оконную функцию следующим образом.Упорядочить окно по зарплате и использовать все строки перед текущей строкой.

from pyspark.sql import Window
import pyspark.sql.functions as F

# You study all the rows before the current one. -1 to avoid counting current row
w = Window.orderBy('salary').rowsBetween(Window.unboundedPreceding,Window.currentRow-1)

# Count salary occurences on the window : salary below current salary
results = df.withColumn('rank_order',F.count('salary').over(w))
results.show()

+---+------+----------+
| id|salary|rank_order|
+---+------+----------+
|  2|   500|         0|
|  3|  1500|         1|
|  1|  2000|         2|
+---+------+----------+
0 голосов
/ 26 июня 2018

Вы можете использовать окно для сортировки, а затем добавить номер строки или другим способом преобразовать в rdd, а затем отсортировать, используя zipWithIndex.Используя окно:

from pyspark.sql import functions as F
from pyspark.sql.window import Window

window = Window \
             .orderBy(F.col('salary'))
df \
   .withColumn('salary', F.dense_rank().over(window))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...