2016-08-14 2 views
0

У меня есть RDD с этими элементами:Группировка в RDD с помощью массива

("a", Array(1, 2)) | ("b", Array(3, 4)) | ("c", Array(1, 2)) 

Я хочу, чтобы сгруппировать его с помощью массива, чтобы иметь это:

(Array("a", "c"), Array(1, 2)) | (Array("b"), Array(3, 4)) 

Как сделать это (предпочтительно в Scala)?

+0

Это должно быть просто, вы пробовали? – Dici

ответ

2

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

val input: RDD[(String, Array[Int])] = ??? 

val result: RDD[(Array[String], Array[Int])] = input 
    .groupBy(_._2.toList) // group by array 
    .values // keep values only, of type Iterable[(String, Array[Int])] 
    .map(it => (it.map(_._1).toArray, it.head._2)) // map back to requested format 
+0

Ваша последняя 'карта' эффективно разрушает разбиение данных, поскольку Spark забудет об этом разделителе RDD. Может быть в порядке в зависимости от того, что хочет OP, но стоит упомянуть – Dici

+0

Я не знал этого ограничения, так как я могу хранить элементы в списке, я улучшу первый RDD, чтобы упростить группировку. Спасибо за объяснение и код. –

+0

@ArmandGrillet - это раздел, важный для вас? Вы должны знать, что вызов 'map' на парном RDD приведет к тому, что Spark удалит метаданные разбиения RDD. – Dici

Смежные вопросы