2016-01-26 2 views
5

Ich bin sehr neu in der Verwendung von Google Cloud Dataflow. Ich möchte das kartesische Produkt von zwei PCollections erhalten. Wenn ich beispielsweise zwei PCollections (1, 2) und ("hello", "world") habe, ist ihr kartesisches Produkt ((1, "hello"), (1, "world"), (2, "hello"), (2, "world")).So erhalten Sie das kartesische Produkt von zwei PCollections

Irgendwelche Ideen, wie ich das tun könnte? Da das kartesische Produkt groß sein könnte, hoffe ich, dass die Lösung das Produkt träge erstellt und somit einen enormen Speicherverbrauch vermeidet.

Danke!

+0

Haben Sie weitere Details zu dem, was Sie tun möchten? Wie groß sind die einzelnen PCollections? Es gibt mehrere Möglichkeiten, dies zu erreichen, und welche davon besser ist, hängt davon ab, warum Sie das kartesische Produkt und die tatsächlichen PCollections verwenden möchten. –

+0

Die beiden PCollections sind identisch. Beide enthalten ungefähr 100.000 Tupel vom Typ '(String, String)'. Ich verwende ein Wörterbuch englischer Wörter und habe ihre phonetische Transkription, um 2-Wort-Wortspiele zu generieren, wie zum Beispiel: "fantasti-CAL-ifornia". –

+0

Für eine direkte kartesische Lösung scheint [this] (http://stackoverflow.com/a/41051283/377366) die beste verfügbare Antwort zu sein. – KobeJohn

Antwort

3

Im Allgemeinen wird die Berechnung des kartesischen Produkts teuer. Wenn eine oder beide der Sammlungen in den Speicher passen, können Sie side-inputs verwenden, um die Daten an alle Mitarbeiter zu senden. Für Ihr Beispiel würden Sie also die PCollection<String> in eine Seiteneingabe umwandeln, und dann hätten Sie eine ParDo, die sie als Haupteingabe verwendet. Für jede Zeichenfolge an der Haupteingabe könnten Sie auf die Seiteneingabe zugreifen, die einen Iterable<String> aller Werte hatte, und Sie würden die Paare ausgeben (oder Sie könnten in diesem DoFn auswählen, nur die Paare auszugeben, die sich aufstellen).

Dies wird jedes Mal über den gesamten Satz von Wörtern wiederholen - wenn es in den Speicher passt, sollte dies in Ordnung sein. Wenn die Seiteneingabedaten jedes Mal neu abgerufen werden müssen, könnte dies problematisch sein.

Ein anderer Ansatz wäre, sich auf Shuffling und Schlüssel zu verlassen. Angenommen, Sie wollten Wörter mit einer Überlappung von drei Buchstaben finden. Sie können das Wörterbuch bearbeiten und einen PCollection von Werten erzeugen, die mit den 3-Buchstaben-Präfixen eingegeben werden. Sie können auch die ähnliche PCollection erstellen, die durch 3-Buchstaben-Suffixe codiert ist. Dann können Sie GroupByKey (oder CoGroupByKey). Danach haben Sie für jeden 3-stelligen Schlüssel alle Wörter mit diesem Präfix und das als Suffix.

+0

Danke für die Eingabe! Ich werde wahrscheinlich mit der 'GroupByKey' Methode gehen! –

+3

Dies beantwortet nicht wirklich die Frage, wie man ein kartesisches Produkt macht. – Max