2016-10-27 4 views
0

У меня есть данные, которые находятся в определенном формате, где каждый элемент в RDD является массивом массивов. Первый элемент в массиве - это ключ, а два элемента после них - значения, связанные с этим ключом. Как я могу объединить эти значения с помощью первого индекса массива?Агрегация массивов в RDD по индексу

Это входная выборка:

Array[Array[Any]] = Array(Array(490, [490], 23225), Array(64, [64], 48262), Array(64, [64,11], 30677), Array(64, [64,11,6], 29865), Array(64, [64,3], 21175), Array(64, [64,6], 39697), Array(6, [6], 601374), Array(77, [77], 43454), Array(77, [77,11], 30409), Array(77, [77,11,6], 29830), Array(77, [77,6], 37654), Array(3, [3], 450031), Array(3, [3,6], 265180), Array(69, [69], 22631), Array(69, [69,6], 20439), Array(11, [11], 364065), Array(11, [11,3], 161286), Array(11, [11,3,6], 143682), Array(11, [11,6], 324013), Array(90, [90], 22062), Array(90, [90,6], 21288), Array(2, [2], 42927), Array(2, [2,11], 20826), Array(2, [2,6], 29619), Array(215, [215], 21592), Array(138, [138], 35127), Array(138, [138,11], 21566), Array(138, [138,11,6], 21008), Array(138, [138,6], 28750), Array(1, [... 

Я хочу, чтобы все массивы, которые имеют ключ 490, чтобы быть сгруппированы вместе, и те, которые имеют ключ 64, чтобы быть вместе, и так далее.

ответ

1

Вы можете использовать группу оператором:

arr.groupBy(_.head) или полной формы arr.groupBy(innerArr => innerArr.head)

Array(Array(400, "sad", "sd"), Array(300, "aa", "sd"), Array(400, "dsa", "asd")) 
    .groupBy(_.head) 
res0: Map[Any, Array[Array[Any]]] = Map(
    400 -> Array(Array(400, sad, sd), Array(400, dsa, asd)), 
    300 -> Array(Array(300, aa, sd)) 
) 

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

arr.groupBy(_.head) 
    .mapValues(_.map(_.tail)) 
res1: Map[Any, Array[Array[Any]]] = Map(
    400 -> Array(Array(sad, sd), Array(dsa, asd)), 
    300 -> Array(Array(aa, sd)) 
) 
+0

Спасибо, что работает отлично. – iamseiko

+1

Вот мое окончательное решение. 'mapy.groupBy (_ (0)). MapValues ​​(_. Map (_. Tail)). Foreach {ind => print (" Key: "+ ind._1 +" Value: "); ind._2.foreach {st => st foreach print;}; println;} ' , который записывает каждый массив строк в собственной строке вместе с ключевым индексом. – iamseiko

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