Jeśli używasz standardowe UDF jython a nie żadnej innej dystrybucji takich jak streaming_python dostarczonych przez dane zaprawy, wszystko co musisz zrobić, to:
@outputSchema('m:map[]')
Klucze będą takie same, które zostały ustawione w python. Jeśli masz inny słowniki w Twojej dict nie należy martwić się o to, świnia będzie go zrozumieć i stosować następującą składnię:
([first#{third=inner_dict},first#outter_dict])
Jest jedna duża wada o przejściu dict powrotem do świni z UDF jython, jesteś może ustawić tylko jeden typ danych dla wszystkich wartości w dykcie, co oznacza, że jeśli nie ustawisz żadnego typu danych, świnia użyje bytearray jako typu danych, co może być problemem podczas pracy z datami lub złożonymi strukturami. Na przykład:
@outputSchema('m:map[chararray]')
Krotki i Torby:
Gdy chcesz powrócić krotki lub torbę z powrotem do świni z A jython UDF warto pamiętać Listy że Python jest konwersja do torby i krotki do krotki . Na przykład:
list:
@outputSchema('m:bag{chararray}')
Pamiętaj, że torby Pig są wypełnione krotek, więc jeśli chcesz ustawić piękny strukturę torbie, można zadeklarować krotki w torbie, i tam będzie mógł ustawić wszystkie typy danych, które będziesz przekazywał. Przykład:
@outputSchema('map_reduce:bag{t:(key:chararray,value:int,start_date:datetime,end_date:datetime)}')
Wreszcie krotki powinny być w jakiś sposób intuicyjny, są najłatwiejsze w użyciu konstrukcja przy użyciu Jython. W krotce możesz ustawić tyle pól, ile chcesz i tyle poziomów, ile chcesz, podążając za powyższymi przykładami. Możesz zadeklarować krotkę w krotce, krotce, która ma torbę i inne wartości, itp.
Zdecydowanie zalecam używanie UDF Java podczas próby wykonywania złożonych operacji lub pracy ze złożonymi typami danych, takimi jak struktury JSON, tablice i listy. Krzywa uczenia się może być nieco bardziej stroma, ale kiedy już to zrobisz, twój rozwój będzie znacznie szybszy, a także przepustowość twojego programu.