Non ci sono differenze di prestazioni importanti. La ragione per cui dico che entrambi finiscono per essere un singolo lavoro MapReduce che invia gli stessi dati ai riduttori. Entrambi devono inviare tutti i record in avanti con la chiave che è la chiave esterna. Se tutto, il COGROUP
potrebbe essere un po 'più veloce perché non fa il prodotto cartesiano attraverso i colpi e li tiene in sacchetti separati.
Se uno dei set di dati è piccolo, è possibile utilizzare un'opzione di join denominata "replicated join". Questo distribuirà il secondo set di dati in tutte le attività della mappa e lo caricherà nella memoria principale. In questo modo, può eseguire l'intero join nel mapper e non è necessario un riduttore. Nella mia esperienza, ne vale la pena perché il collo di bottiglia in join e cogroups è il rimescolamento dell'intero set di dati al riduttore. Non puoi farlo con COGROUP
, per quanto ne so.
fonte
2011-09-21 13:13:17
Internamente, unire e cogroup sono la stessa cosa in Pig (e non c'è cartesiana succedendo in si unisce, non so cosa vuoi dire lì). Solo il formato del risultato finale cambia a seconda della parola chiave che hai usato. Prova a "descrivere" sul risultato di un join: vedrai l'operatore COGROUP nel piano di spiegazioni. – SquareCog
Cosa intendo per prodotto cartesiano, è che se ci sono più corrispondenze sulla chiave esterna, otterrete più record. Ad esempio, se ci sono 3x "abcde" nell'unico set di dati, e poi 4x "abcde" nel secondo set di dati, emette 12x record perché corrisponde a ciascuno di essi. Nel frattempo, in COGROUP, mantiene le relazioni separate. –