Выполнение reduByKey для каждого раздела СДР отдельно без агрегирования результатов. - PullRequest
0 голосов
/ 11 мая 2018

У меня есть раздел RDD в кластере, и я хочу сделать reduceByKey для каждого раздела отдельно.Я не хочу, чтобы результат ReduByKey на разделах был объединен.Я хочу, чтобы Spark не перемешивал промежуточные результаты ReduByKey в кластере.

Приведенный ниже код не работает, но я хочу вот что:

myPairedRDD.mapPartitions({iter => iter.reduceByKey((x, y) => x + y)})

Как этого добиться?

1 Ответ

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

Вы можете попробовать что-то

myPairedRDD.mapPartitions(iter => 
  iter.groupBy(_._1).mapValues(_.map(_._2).reduce(_ + _)).iterator
)

или повысить эффективность использования памяти (здесь я предполагаю, что myPairedRDD равно RDD[(String, Double)]. Пожалуйста, настройте типы в соответствии с вашим вариантом использования):

myPairedRDD.mapPartitions(iter => 
  iter.foldLeft(mutable.Map[String, Double]().withDefaultValue(0.0)){ 
    case  (acc, (k, v)) => {acc(k) += v; acc}
  }.iterator
)

но учтите, что в отличие от операций тасования он не может выгружать данные из памяти.

...