Pyspark - удаление строк с совпадающими значениями на основе сравнения других значений - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть данные, которые вы видите ниже в файлах, которые мне регулярно доставляют

2018-11-06 00        46      3574                                             
2018-11-06 01        21      1667                                             
2018-11-06 02        22      1650 

Я очень часто получаю дубликаты в последующих файлах и обрабатываю их примерно так:

df2=df.dropDuplicates()

Моя проблема в том, что иногда я получаю значение, которое является дубликатом первых 2-х столбцов, но 3-й и 4-й столбцы отличаются. Таким образом, в двух разных файлах я мог бы получить это:

FILE 1
2018-11-06 01        21      1667 

FILE 2
2018-11-06 01        23      1682

и тогда мой фрейм данных выглядит так:

2018-11-06 00        46      3574
2018-11-06 01        21      1667
2018-11-06 01        23      1682
2018-11-06 02        22      1650

Когда это происходит, мне нужны уникальные значения для первых 2 столбцов, и я хочу сделать это, сохранив строку с наибольшим значением в 4-м столбце. Поэтому я хочу, чтобы мои данные выглядели так, когда я закончу:

2018-11-06 00        46      3574
2018-11-06 01        23      1682
2018-11-06 02        22      1650

И я не могу понять, как это сделать. Такое ощущение, что мне нужно использовать окно, но я не могу понять, как это сделать.

1 Ответ

0 голосов
/ 07 ноября 2018

Самый простой способ добиться этого - использовать rank(). Я не тестировал его, но ниже приведен некоторый в основном функциональный код, который поможет вам на 95%.

from pyspark.sql import Window
from pyspark.sql.functions import desc, rank

# The ranking ordering is by col4 descending, then col3 descending as a tiebreaker.
rank_window = Window.partitionBy("col1", "col2").orderBy(desc("col4"), desc("col3"))
df.withColumn("rank", rank().over(rank_window)).filter("rank=1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...