2012-11-12 10 views
8

Jaki jest wyjściowy schemat, aby zwrócić słownik z Python UDF podczas korzystania z Apache PIG.Jak: Python UDF Schemat powrotu słownika w PIG

Mam słownika słowników, coś takiego:

dict = {x:{a:1,b:2,c:3}, y:{d:1,e:3,f:9}} 

i mój schemat wyjściowy wygląda

@outputSchema("m:map[im:map[X:float,Y:float]]") 

** nawiasy kwadratowe, ponieważ w Pig używamy [] na mapie, które tego słownik jest konwertowany na.

Odpowiedz

3

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.