pyspark - как я могу удалить все дублирующиеся строки (игнорируя определенные столбцы) и не оставляя после себя пары дубликатов?

1

У меня есть следующая таблица:

df = spark.createDataFrame([(2,'john',1),
                            (2,'john',1),
                            (3,'pete',8),
                            (3,'pete',8),
                            (5,'steve',9)],
                           ['id','name','value'])

df.show()

+----+-------+-------+--------------+
| id | name  | value |     date     |
+----+-------+-------+--------------+
|  2 | john  |     1 | 131434234342 |
|  2 | john  |     1 | 10-22-2018   |
|  3 | pete  |     8 | 10-22-2018   |
|  3 | pete  |     8 | 3258958304   |
|  5 | steve |     9 | 124324234    |
+----+-------+-------+--------------+

Я хочу удалить все повторяющиеся пары (когда дубликаты встречаются в id, name или value, но NOT date), поэтому я получаю:

+----+-------+-------+-----------+
| id | name  | value |   date    |
+----+-------+-------+-----------+
|  5 | steve |     9 | 124324234 |
+----+-------+-------+-----------+

Как я могу это сделать в PySpark?

Теги:
apache-spark
pyspark

2 ответа

1
Лучший ответ

Вы можете groupBy id, name и value и фильтр в столбце count ::

df = df.groupBy('id','name','value').count().where('count = 1')

df.show()

+---+-----+-----+-----+
| id| name|value|count|
+---+-----+-----+-----+
|  5|steve|    9|    1|
+---+-----+-----+-----+

Вы могли бы в конечном итоге отказаться от count столбца, если это необходимо

0

Сделайте groupBy для столбцов, которые вы хотите, и count и сделайте фильтр, где count равно 1 а затем вы можете сбросить столбец count как показано ниже.

import pyspark.sql.functions as f

df = df.groupBy("id", "name", "value").agg(f.count("*").alias('cnt')).where('cnt = 1').drop('cnt') 

Вы можете добавить столбец date в условии GroupBy если хотите

Надеюсь, это поможет вам

  • 0
    может быть проще использовать функцию Window поэтому все столбцы будут сохранены.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню