pyspark удаляет повторяющиеся строки на основе значения столбца - PullRequest
0 голосов
/ 05 мая 2018

У меня есть PySpark RDD . Я хочу исключить дубликаты только тогда, когда "столбец 1" и "столбец 2" совпадают в следующей строке . Вот как выглядят данные:

2,10482422,0.18
2,10482422,0.4
2,10482423,0.15
2,10482423,0.43
2,10482424,0.18
2,10482424,0.49
2,10482425,0.21
2,10482425,0.52
2,10482426,0.27
2,10482426,0.64
2,10482427,0.73

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

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

2,10482422,0.4
2,10482423,0.43
2,10482424,0.49
2,10482425,0.52
2,10482426,0.64
2,10482427,0.73

Я попытался создать фрейм данных и использовать df.dropDuplicates(), но он не дает ожидаемого ответа. Как сохранить максимальное значение в этом СДР на основе двух столбцов?

Это RDD на 350 ГБ, любые оптимальные предложения будут отличными.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Не на 100% ясно из вашего ответа, хотите ли вы использовать DataFrames или нет, но если вы счастливы создать DF из вашего RDD, вы также можете использовать следующее:

from pyspark.sql import functions as f
df.groupby('column1', 'column2')
  .agg(f.max(f.col('value').alias('maxval'))
0 голосов
/ 05 мая 2018

Я думаю, что ReduByKey поможет здесь.

Помните, что при использовании reduByKey или любого другого преобразования или действия «По ключу» вы можете определить ключ как кортеж.

rdd = sc.parallelize([(2,10482422,0.18),
(2,10482422,0.4),
(2,10482423,0.15),
(2,10482423,0.43),
(2,10482424,0.18),
(2,10482424,0.49),
(2,10482425,0.21),
(2,10482425,0.52),
(2,10482426,0.27),
(2,10482426,0.64),
(2,10482427,0.73)])

print rdd.map(lambda x: ((x[0], x[1]), x[2]))\
.reduceByKey(lambda x, y: x if x >= y else y)\
.collect()

результат:

[((2, 10482427), 0.73),
 ((2, 10482425), 0.52),
 ((2, 10482426), 0.64),
 ((2, 10482423), 0.43),
 ((2, 10482424), 0.49),
 ((2, 10482422), 0.4)]
...