0

Ich habe zwei RDDS (Funke Scala) wie unten:Das kartesische Produkt zweier RDDs und die Summe der Cartesion ergeben Spark (Scala)?

RDD1 ist Array((1,Array(1,2,3)),(2,Array(1,2,4)))

RDD2 Array((1,Array(4,5,6)),(2,Array(3,5,6))) ist

Zuerst muss ich über zwei RDDs Kartesischen und Summation der Arraywerte erzeugen.

zum Beispiel ist cartesianischen wie unten:

((11,(Array(1,2,3),Array(4,5,6))),(12,(Array(1,2,3),Array(3,5,6))),(21,(Array(1,2,4),Array(4,5,6))),(22,(Array(1,2,4),Array(3,5,6)))) 

cartesianischen und Summierung wie unten:

Array((11,1*4+2*5+3*6) ,(12,1*3+2*5+3*6),(21,(1*4+2*5+4*6))(22,(1*3+2*5+4*6)) 

Ich habe wie unter cartesianischen versucht:

scala> val cart=rdd1.cartesian(rdd2) 

aber ich bin immer Ergebnis wie:

Array[((Int, Array[Double]), (Int, Array[Double]))] i.e. 

(((1,(Array(1,2,3))),(1,Array(4,5,6))), 
    ((1,(Array(1,2,3))),(2,Array(3,5,6))), 
    ((2,(Array(1,2,4))),(1,Array(4,5,6))), 
    ((2,(Array(1,2,4))),(2,Array(3,5,6))) 
) 

bitten mir zu diesem Thema helfen, wie

Array((11,1*4+2*5+3*6) ,(12,1*3+2*5+3*6),(21,(1*4+2*5+4*6))(22,(1*3+2*5+4*6)) 

Antwort

1

Sie einfach über die kartesischen zur Karte zu erreichen, müssen die Schlüssel sammeln und das innere Produkt der beiden Arrays berechnen:

rdd1.cartesian(rdd2).map{ 
    case ((k1, v1), (k2, v2)) => (k1, k2) -> v1.zip(v2).map(x => x._1 * x._2).reduce(_ + _) 
}.collect 

// res5: Array[((Int, Int), Int)] = Array(((1,1),32), ((1,2),31), ((2,1),38), ((2,2),37)) 
+1

Danke für deine Hilfe. Es funktioniert :) Angenommen, ich möchte die Ausgabe wie folgt ausgeben ::::::: Array ((11,32), (12,31), (21,38), (22,37)). Wie kann ich das erreichen? –

Verwandte Themen