2016-01-26 18 views
5

Jestem bardzo nowy w korzystaniu z Google Cloud Dataflow. Chciałbym otrzymać kartezjański produkt dwóch PCollections. Na przykład, jeśli mam dwa PCollections (1, 2) i ("hello", "world"), ich produkt kartezjański to ((1, "hello"), (1, "world"), (2, "hello"), (2, "world")).Jak zdobyć produkt kartezjański dwóch PCcollections

Jakieś pomysły, w jaki sposób mogę to zrobić? Ponadto, ponieważ produkt kartezjański może być duży, mam nadzieję, że rozwiązanie to leniwie stworzy produkt, a tym samym uniknie dużego zużycia pamięci.

Dzięki!

+0

Czy masz więcej informacji na temat tego, co próbujesz zrobić? Jak duże są poszczególne PCollections? Istnieje kilka sposobów na osiągnięcie tego celu, a który z nich jest lepszy, zależy od tego, jaki jest powód, dla którego chcesz otrzymać produkt kartezjański i faktyczne kolekcje PCollections. –

+0

Dwa PCollections są identyczne. Oba zawierają około 100 000 krotek typu '(String, String)'. Używam słownika angielskich słów i otrzymałem ich fonetyczną transkrypcję w celu wygenerowania 2-głosowych słów, takich jak: "fantasti-CAL-ifornia". –

+0

Dla bezpośredniego rozwiązania kartezjańskiego, [this] (http://stackoverflow.com/a/41051283/377366) wydaje się być najlepszą dostępną odpowiedzią na razie. – KobeJohn

Odpowiedz

3

Ogólnie rzecz biorąc, obliczanie produktu kartezjańskiego będzie kosztowne. Jeśli jedna (lub obie) z kolekcji mieści się w pamięci, możesz użyć side-inputs, aby przesłać dane do wszystkich pracowników. Tak więc dla przykładu, zmieniłbyś PCollection<String> w wejście boczne, a następnie miałbyś ParDo, który wziąłby go jako główne wejście. Dla każdego ciągu na głównym wejściu można uzyskać dostęp do wejścia bocznego, które ma Iterable<String> wszystkich wartości, a ty wypiszesz pary (lub możesz w tym DoFn zdecydować, aby wyprowadzać tylko pary, które są ustawione w linii).

Spowoduje to powtórzenie całego zestawu słów za każdym razem - jeśli pasuje do pamięci, powinno być dobrze. Jeśli ma on ponownie pobrać boczne dane wejściowe za każdym razem, gdy może to być problematyczne.

Innym podejściem byłoby poleganie na tasowaniu i klawiszach. Załóżmy, że chcesz znaleźć słowa z 3-literowym zachodzeniem na siebie. Możesz przetworzyć słownik i wytworzyć PCollection wartości z kluczem za pomocą 3-literowych prefiksów. Możesz również utworzyć podobne PCollection z trzema listowymi sufiksami. Następnie możesz GroupByKey (lub CoGroupByKey). Następnie musisz dla każdego trzyliterowego klucza, wszystkie słowa z tym jako przedrostkiem i jako sufiks.

+0

Dzięki za wejście! Prawdopodobnie zastosuję metodę 'GroupByKey'! –

+3

To nie odpowiada na pytanie, jak zrobić produkt kartezjański. – Max

Powiązane problemy