2017-03-05 2 views
1

// Ich bin mit Funken 2.01 //Wie führe ich diese Art von kartesisches Produkt in Funken 2,01

Und meine Daten aussieht,

(K1,Array(V1,V2,V3.....V30)) 
(K2,Array(V1,V2,V3.....V30)) 
(K3,Array(V1,V2,V3.....V30)) 
... 
(K3704, Array(V1,V2,V3.....V30)) 

und ich möchte ein erstellen kartesischer Produktlistenwert für jeden Schlüsselwert

(K1, (V1,V2),(V1,V3),(V1,V4) ... 
(K2, (V2,V3),(V2,V4),(V2,V5) ... 
... 
//PS. there are no duplicate elements like (V1,V2) == (V2,V1) 

Und ich denke, es wird eine 30 sein! Operation für jeden Schlüssel, aber es wäre besser, wenn es optimiert werden könnte.

Antwort

1

In Python können wir combinations() Funktion aus dem Paket itertools innen mapValues() verwenden:

from itertools import combinations 
rdd.mapValues(lambda x: list(combinations(x, 2))) 

In Scala, wir die combinations() Verfahren in ähnlicher Weise verwendet werden können. Aber weil es nur ingests und Ausgänge Objekte Seq geben, werden wir an die Kette haben zusammen ein paar weitere Methoden an Ihrem erwarteten Format ankommen:

rdd.mapValues(_.toSeq.combinations(2).toArray.map{case Seq(x,y) => (x,y)}) 
+0

Dank! Es hat sehr geholfen!^- ^ –

Verwandte Themen