Um zu vermeiden, die Berechnung aller möglichen Kombinationen verwenden, ich versuche zu einem bestimmten Schlüssel zur Gruppenwerte nach, und dann das kartesische Produkt der Werte für jeden Schlüssel zu berechnen, das heißt:kartesisches Produkt Optimierung Schlüssel in Funken
Input [(k1, v1), (k1, v2), (k2, v3)]
Wunsch Ausgabe: [(v1, v1), (v1, v2), (v2, v2), (v2, v1), (v3, v3)]
Hier ist der Code habe ich versucht, die Ausführung:
val input = sc.textFile('data.csv')
val rdd = input.map(s=>s.split(","))
.map(s => (s(1).toString, s(2).toString))
val group_result:RDD[String, Iterable[String]] = rdd.groupByKey()
group_result.flatMap { t =>
{
val stream1= t._2.toStream
val stream2= t._2.toStream
stream1.flatMap { src =>
stream2.par.map { trg =>
src + "," + trg
}
}
}
}
Dies funktioniert für sehr kleine Dateien in Ordnung, aber wenn die Liste (Iterable) der Länge von ~ 1000 die Berechnung vollständig gefriert.
Sie sollten RDD-Karten (Transformationen im Allgemeinen) nicht mit Scala-nativen mischen. Innere sind nicht von Spark optimiert; Vielleicht ist das der Grund, warum es einfriert. –
@ TomaszBłachut Whaaaat? Warum solltest du nicht? :) 'groupByKey' ist wahrscheinlich nicht die beste Idee hier,' toStream' bietet keine Vorteile, und einfaches selbst 'Join' wäre genug, aber es ist nichts besonderes falsch mit" Scala map ". – zero323
@ zero323 Danke für die Klarstellung, ich denke, ich sollte anfangen, meine Kommentare mit AFAIR voranzutreiben:> Das existiert in meinem Kopf als etwas, was ich nicht tun soll, vielleicht habe ich verschiedene Beispiele gesehen, die schlecht aussahen –