Рейтинг Pyspark на основе предыдущего / текущего ряда - PullRequest
1 голос
/ 23 февраля 2020

Ниже указан мой исходный и ожидаемый выходные данные.

Input/Expected dataframe

Мне нужно применить приведенную ниже логику c и вычислить окончательное значение ранга, если предыдущий строка (hdr) == текущая строка (hdr) & предыдущая строка (dtl) == текущая строка (dtl),
, затем назначьте ранг предыдущей строки, иначе предыдущий ранг строки + 1

Я не мог двигаться жду поста плотного рейтинга. Можете ли вы поделиться своими мнениями? Я пытаюсь избежать окна без столбца partitionBy, учитывая потенциальные потери производительности

sample = [(100,1000),(100, 1000), (100, 2000), (200, 1000), (200,1000), (300,1000), (300,2000)]
test = spark.createDataFrame(sample,['hdr','dtl'])
spec = Window.partitionBy('hdr').orderBy('hdr','dtl')
test.withColumn('dense', func.dense_rank().over(spec)).show()

1 Ответ

0 голосов
/ 23 февраля 2020

Я не думаю, что ранжирование без окон возможно, и в вашем случае, так как ранжирование должно происходить по всему набору данных, невозможно избежать оконной функции без partitionBy, но мы можем уменьшить огромное количество данных, поступающих в один раздел с кодом ниже.

sample = [(100,1000),(100, 1000), (100, 2000), (200, 1000), (200,1000), (300,1000), (300,2000)]
test = spark.createDataFrame(sample,['hdr','dtl'])

# Since we select only distinct of hdr and dtl huge amount of data is eliminated.
dist_hdr_dtl=test.select("hdr","dtl").distinct()

# Since data size is reduced we can use this window spec.
spec = Window.orderBy('hdr','dtl')
dist_hdr_dtl=dist_hdr_dtl.withColumn('final_rank', dense_rank().over(spec))

# join it with original data to get the ranks.
Note: if distinct dataset is not very huge you can use broadcast join which will improve performance
test.join(dist_hdr_dtl,["hdr","dtl"],"inner").orderBy('hdr','dtl').show()

+---+----+----------+
|hdr| dtl|final_rank|
+---+----+----------+
|100|1000|         1|
|100|1000|         1|
|100|2000|         2|
|200|1000|         3|
|200|1000|         3|
|300|1000|         4|
|300|2000|         5|
+---+----+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...