2016-01-26 22 views
5

Sono molto nuovo nell'usare Google Cloud Dataflow. Vorrei ottenere il prodotto cartesiano di due PC. Ad esempio, se ho due PColections (1, 2) e ("hello", "world"), il loro prodotto cartesiano è ((1, "hello"), (1, "world"), (2, "hello"), (2, "world")).Come ottenere il prodotto cartesiano di due PC:

Qualche idea su come potrei farlo? Inoltre, poiché il prodotto cartesiano potrebbe essere grande, spero che la soluzione crei pigramente il prodotto, evitando così un enorme consumo di memoria.

Grazie!

+0

Avete ulteriori dettagli su ciò che state cercando di fare? Quanto sono grandi ciascuno dei PCollections? Ci sono diversi modi per ottenere questo risultato, e quale è meglio dipende dal motivo per cui si desidera il prodotto cartesiano e le effettive raccolte di PC coinvolte. –

+0

I due PC sono identici. Entrambi contengono circa 100.000 tuple di tipo '(String, String)'. Sto usando un dizionario di parole inglesi e ho ottenuto la loro trascrizione fonetica al fine di generare giochi di parole di 2 parole, come: "fantasti-CAL-ifornia". –

+0

Per una soluzione cartesiana diretta, [questo] (http://stackoverflow.com/a/41051283/377366) sembra essere la migliore risposta disponibile per ora. – KobeJohn

risposta

3

In generale, il calcolo del prodotto cartesiano sarà costoso. Se una o entrambe le collezioni sono in memoria, è possibile utilizzare side-inputs per trasmettere i dati a tutti i lavoratori. Quindi, per il tuo esempio, devi convertire lo PCollection<String> in un input laterale, e quindi avresti un ParDo che lo ha preso come input principale. Per ogni stringa sull'input principale, è possibile accedere all'input laterale che aveva uno Iterable<String> di tutti i valori, e si sarebbero emesse le coppie (o si poteva in questo DoFn scegliere di emettere solo le coppie che si allineano).

Questa volontà di ripetere l'intera serie di parole ogni volta - se si inserisce nella memoria questo dovrebbe andare bene. Se deve recuperare i dati di input laterali ogni volta che potrebbe essere problematico.

Un altro approccio sarebbe affidarsi a mischiare e chiavi. Supponi di voler trovare le parole con una sovrapposizione di 3 lettere. È possibile elaborare il dizionario e produrre uno PCollection valori con i prefissi a 3 lettere. È anche possibile creare lo stesso PCollection con suffissi di 3 lettere. Quindi è possibile GroupByKey (o CoGroupByKey). Dopodiché, hai per ogni tasto di 3 lettere tutte le parole con quel prefisso e quello come suffisso.

+0

Grazie per l'input! Probabilmente andrò con il metodo 'GroupByKey'! –

+3

Questo in realtà non risponde alla domanda su come fare un prodotto cartesiano. – Max