2017-01-13 9 views
1

У меня есть упорядоченное RDD типа ((id, ts), some value). Это было разделено с использованием настраиваемого разделителя в поле id.Запуск groupByKey/reduceBuKey по секционированным данным, но с разным ключом

math.abs(id.hashCode % numPartitions) 

Теперь Если я бегу следующих две функций на этом многораздельном РДЕ, он будет включать в себя перестановку и повторное разбиение данных.

val partitionedRDD: ((id:Long, ts:Long), val:String) = <Some Function> 
val flatRDD = orderedRDD.map(_ => (_._1.id, (_._1.ts, _._2))) 

То, что я хочу знать, является ли flatRDD.groupByKey() и flatRDD.reduceByKey() будет иметь такое же разделение, как partitionedRDD или искра будет перетасовать набор данных снова и создавать новые разделы?

Спасибо, Devi

ответ

1

Да, выполняя groupByKey или reduceByKey на flatRDD обязательно вызовет другую перетасовать.

Поскольку вы знаете, что ваш flatRDD уже разделен id, можно смело предположить, что все записи с одинаковыми id находятся в одном разделе. Поэтому, если вы хотите groupBy(id), вы можете использовать mapPartitionspreservesPartitioning = true) и выполнить эту операцию для каждого раздела отдельно, таким образом предотвращая искру от перетасовки ваших данных:

flatRDD.mapPartitions({ it => 
    it.toList 
    .groupBy(_._1).mapValues(_.size) // some grouping + reducing the result 
    .iterator 

}, preservesPartitioning = true) 

Это не вызовет дополнительные перетасовать:

enter image description here