2011-09-21 12 views

Odpowiedz

12

Nie ma dużych różnic w wydajności. Powodem, dla którego to mówię, jest to, że oba są jedną pracą MapReduce, która przesyła te same dane do reduktorów. Oba muszą wysłać wszystkie rekordy do przodu, przy czym kluczem jest klucz obcy. Jeśli w ogóle, model COGROUP może być nieco szybszy, ponieważ nie wykonuje on kartezjańskiego produktu po trafieniach i trzyma je w oddzielnych torbach.

Jeśli jeden z zestawów danych jest mały, można użyć opcji łączenia o nazwie "replicated join". Spowoduje to dystrybucję drugiego zestawu danych we wszystkich zadaniach mapowych i załadowanie go do pamięci głównej. W ten sposób może wykonać całe sprzężenie w programie odwzorowującym i nie potrzebuje reduktora. Z mojego doświadczenia wynika, że ​​jest to tego warte, ponieważ wąskim gardłem w połączeniach i cyklach jest przetasowanie całego zestawu danych do reduktora. Nie możesz tego zrobić z COGROUP, według mojej wiedzy.

+0

Wewnętrznie, join i cogroup są tym samym w Pig (i nie ma cartesian dołączyć w złączach, nie wiesz co masz na myśli). Tylko format wyniku końcowego zmienia się w zależności od użytego słowa kluczowego. Spróbuj "opisać" wynik połączenia - zobaczysz operatora COGROUP w planie wyjaśniającym. – SquareCog

+0

Co mam na myśli przez produkt kartezjański, jest to, że jeśli istnieje wiele dopasowań na klucz obcy, dostaniesz więcej rekordów. Na przykład, jeśli istnieje 3x "abcde" w jednym zestawie danych, a następnie 4x "abcde" w drugim zestawie danych, wyprowadza 12x rekordów, ponieważ dopasowuje każdy z nich. Tymczasem w COGROUP utrzymuje relacje odrębne. –