Pyspark drop_duplicates (keep = False) - PullRequest
       7

Pyspark drop_duplicates (keep = False)

0 голосов
/ 09 января 2019

Мне нужно решение Pyspark для Pandas drop_duplicates(keep=False). К сожалению, опция keep=False недоступна в pyspark ...

Панды Пример:

import pandas as pd

df_data = {'A': ['foo', 'foo', 'bar'], 
         'B': [3, 3, 5],
         'C': ['one', 'two', 'three']}
df = pd.DataFrame(data=df_data)
df = df.drop_duplicates(subset=['A', 'B'], keep=False)
print(df)

Ожидаемый результат:

     A  B       C
2  bar  5  three

Конвертация .to_pandas() и обратно в pyspark не возможна.

Спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Используйте оконную функцию для подсчета количества строк для каждой комбинации A / B, а затем отфильтруйте результат, чтобы сохранить только уникальные строки:

import pyspark.sql.functions as f

df.selectExpr(
  '*', 
  'count(*) over (partition by A, B) as cnt'
).filter(f.col('cnt') == 1).drop('cnt').show()

+---+---+-----+
|  A|  B|    C|
+---+---+-----+
|bar|  5|three|
+---+---+-----+

Или другой вариант, используя pandas_udf:

from pyspark.sql.functions import pandas_udf, PandasUDFType

# keep_unique returns the data frame if it has only one row, otherwise 
# drop the group
@pandas_udf(df.schema, PandasUDFType.GROUPED_MAP)
def keep_unique(df):
    return df.iloc[:0] if len(df) > 1 else df

df.groupBy('A', 'B').apply(keep_unique).show()
+---+---+-----+
|  A|  B|    C|
+---+---+-----+
|bar|  5|three|
+---+---+-----+
...