Уменьшите rdd карт

#scala #apache-spark

#scala #apache-искра

Вопрос:

У меня есть и rdd, как это :

 Map(A -gt; Map(A1 -gt; 1)) Map(A -gt; Map(A2 -gt; 2)) Map(A -gt; Map(A3 -gt; 3)) Map(B -gt; Map(B1 -gt; 4)) Map(B -gt; Map(B2 -gt; 5)) Map(B -gt; Map(B3 -gt; 6)) Map(C -gt; Map(C1 -gt; 7)) Map(C -gt; Map(C2 -gt; 8)) Map(C -gt; Map(C3 -gt; 9))  

Мне нужно, чтобы тот же rdd был уменьшен на ключ и имел столько же значений, сколько и ранее:

 Map(A -gt; Map(A1 -gt; 1, A2 -gt; 2, A3 -gt; 3)) Map(B -gt; Map(B1 -gt; 4, B2 -gt; 5, B3 -gt; 6)) Map(C -gt; Map(C1 -gt; 7, C2 -gt; 8, C3 -gt; 9))  

Я попытался уменьшить:

 val prueba = replacements_2.reduce((x,y) =gt; x    y)  

Но остается только значение последнего элемента, оцененного с тем же ключом:

 (A,Map(A3 -gt; 3)) (C,Map(C3 -gt; 9)) (B,Map(B3 -gt; 6))  

Комментарии:

1. Можете ли вы показать, что вы пробовали и почему это не сработало?

2. Сделано! Взгляните сами!

Ответ №1:

Я думаю, что вы должны моделировать свои данные по-другому, ваш Map подход кажется немного неуклюжим. Зачем представлять 1 запись a Map с 1 элементом? А Tuple2 больше подходит для этого… В любом случае, тебе нужно reduceByKey . Для этого вам сначала нужно преобразовать ваш rdd в RDD с ключом-значением:

 rdd  .map(m =gt; (m.keys.head,m.values.head)) // create key-value RDD  .reduceByKey((a,b) =gt; a  b) // merge maps  .map{case (k,v) =gt; Map(k -gt; v)} // create Map again