Dzisiejszy post dotyczy funkcji Load w Apache Pig. To jest kontynuacja pierwszy post który obejmował funkcje UDF, takie jak Eval, Filter i Aggregate. Prosimy o ponowne skontaktowanie się z nimi, aby uzyskać więcej informacji na temat innych funkcji Pig UDF.
Funkcja ładowania Pig jest zbudowana na podstawie InputFormat Hadoop, klasy używanej przez Hadoop do odczytywania danych. InputFormat ma dwa cele: określa, w jaki sposób dane wejściowe będą fragmentowane między zadaniami mapy i zapewnia RecordReader, który daje w wyniku pary klucz-wartość jako dane wejściowe do tych zadań map. Klasą bazową dla funkcji load jest LoadFunc.
oracle pl sql najlepsze praktyki obsługi błędów
Funkcja obciążenia - klasyfikacja:
Klasa abstrakcyjna LoadFunc ma trzy główne metody ładowania danych iw większości przypadków wystarczy je rozszerzyć. Istnieją trzy inne opcjonalne interfejsy, które można zaimplementować w celu uzyskania rozszerzonej funkcjonalności:
LoadMetadata:
LoadMetadata ma metody radzenia sobie z metadanymi. Większość programów ładujących nie musi tego implementować, chyba że współdziałają z systemem metadanych. Metoda getSchema () w tym interfejsie umożliwia implementacjom modułu ładującego przekazanie informacji o schemacie danych do Pig. Jeśli implementacja modułu ładującego zwraca dane składające się z pól typu rzeczywistego, to powinna udostępniać schemat opisujący dane zwracane przez metodę getSchema (). Inne metody dotyczą innych typów metadanych, takich jak klucze partycji i statystyki. Implementacje mogą zwracać null zwracane wartości dla tych metod, jeśli nie są one prawidłowe dla innej implementacji.
LoadPushDown:
LoadPushDown ma różne metody wypychania operacji ze środowiska uruchomieniowego Pig do implementacji modułu ładującego. Obecnie tylko metoda pushProjection () jest wywoływana przez Pig, aby przekazać programowi ładującemu dokładne pola wymagane w skrypcie Pig. Implementacja modułu ładującego może zdecydować, czy będzie przestrzegać żądania, czy nie. Jeśli implementacja modułu ładującego zdecyduje się spełnić żądanie, powinna zaimplementować LoadPushDown, aby poprawić wydajność zapytań.
pushProjection ():
Ta metoda informuje LoadFunc, które pola są wymagane w skrypcie Pig. W ten sposób umożliwia LoadFunc zwiększenie wydajności poprzez ładowanie tylko wymaganych pól. pushProjection () przyjmuje „requiredFieldList”. „requiredFieldList” jest tylko do odczytu i nie może być zmienione przez LoadFunc. „RequiredFieldList” zawiera listę „requiredField”, gdzie każde „requiredField” wskazuje pole wymagane przez skrypt Pig i składa się z indeksu, aliasu, typu i podpola. Pig używa indeksu kolumny requiredField.index do komunikowania się z LoadFunc o polach wymaganych przez skrypt Pig. Jeśli wymaganym polem jest mapa, Pig przekaże „requiredField.subFields”, która zawiera listę kluczy wymaganych przez skrypty Pig dla mapy.
jak uzyskać długość tablicy javascript
LoadCaster:
LoadCaster posiada techniki konwertowania tablic bajtowych na określone typy. Implementacja modułu ładującego powinna to zaimplementować, gdy trzeba obsługiwać niejawne lub jawne rzutowanie z pól DataByteArray na inne typy.
Klasa abstrakcyjna LoadFunc jest główną klasą rozszerzaną w celu implementacji modułu ładującego. Metody, które należy zastąpić, opisano poniżej:
getInputFormat ():
Ta metoda jest wywoływana przez Pig w celu pobrania InputFormat używanego przez moduł ładujący. Metody w InputFormat są wywoływane przez Pig w taki sam sposób jak Hadoop w programie Java MapReduce. Jeśli InputFormat jest pakietem Hadoop, implementacja powinna korzystać z nowego interfejsu API, w ramach org.apache.hadoop.mapreduce. Jeśli jest to niestandardowy format InputFormat, lepiej jest go zaimplementować za pomocą nowego interfejsu API w org.apache.hadoop.mapreduce.
ustal miejsce():
Ta metoda jest wywoływana przez Pig w celu przekazania lokalizacji ładowania do modułu ładującego. Program ładujący musi użyć tej metody, aby przekazać te same informacje do rdzenia InputFormat. Ta metoda jest wielokrotnie wywoływana przez świnię.
preparatToRead ():
W tej metodzie RecordReader powiązany z InputFormat dostarczonym przez LoadFunc jest przesyłany do LoadFunc. RecordReader może być teraz używany przez implementację w getNext (), aby zwrócić krotkę reprezentującą rekord danych z powrotem do Pig.
getNext ():
Znaczenie metody getNext () nie uległo zmianie i jest wywoływane przez środowisko wykonawcze Pig w celu uzyskania następnej krotki w danych. W tej metodzie implementacja powinna używać bazowego RecordReader i skonstruować krotkę do zwrócenia.
Domyślne implementacje w LoadFunc:
Zwróć uwagę, że domyślne implementacje w LoadFunc powinny być zastępowane tylko wtedy, gdy są potrzebne.
setUdfContextSignature ():
Ta metoda zostanie wywołana przez Pig, zarówno z przodu, jak iz tyłu, aby przekazać unikalny podpis do modułu ładującego. Podpis można wykorzystać do przechowywania dowolnych informacji w UDFContext, które moduł ładujący musi przechowywać między różnymi wywołaniami metod w interfejsie użytkownika i zapleczu. Przykładem użycia jest przechowywanie RequiredFieldList przekazanego do niego w LoadPushDown.pushProjection (RequiredFieldList) do użycia w zapleczu przed zwróceniem krotek w getNext (). Domyślna implementacja w LoadFunc ma pustą treść. Ta metoda zostanie wywołana przed innymi metodami.
względnaToAbsolutePath ():
Środowisko uruchomieniowe świń wywoła tę metodę, aby umożliwić modułowi ładującemu konwersję względnej lokalizacji ładowania na lokalizację bezwzględną. Domyślna implementacja udostępniona w LoadFunc obsługuje to dla lokalizacji FileSystem. Jeśli źródło ładowania jest czymś innym, implementacja modułu ładującego może to zastąpić.
Implementacja modułu ładującego w tym przykładzie to moduł ładujący dla danych tekstowych z ogranicznikiem linii jako „
„I” jako domyślny ogranicznik pola podobny do obecnego programu ładującego PigStorage w Pig. Implementacja używa istniejącego formatu InputFormat obsługiwanego przez Hadoop - TextInputFormat - jako podstawowego InputFormat.
public class SimpleTextLoader rozszerza LoadFunc {protected RecordReader in = null private byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {} / ** Moduł ładujący świnie, który używa określonego znaku jako ogranicznika pola. * * @param separator * znak jednobajtowy używany do oddzielania pól. * (wartością domyślną jest „”.) * / public SimpleTextLoader (ogranicznik ciągu znaków) {this () if (delimiter.length () == 1) {this.fieldDel = (bajt) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {switch (delimiter.charAt (1)) {case 't': this.fieldDel = (byte) '' break case 'x' : fieldDel = Integer.valueOf (delimiter.substring (2), 16). byteValue () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: throw new RuntimeException ('Unknown delimiter' + delimiter)}} else {throw new RuntimeException ('PigStorage delimeter must be a single character')}} @Override public Tuple getNext () rzuca IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Text value = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len = value.getLength () int start = 0 for (int i = 0 iMasz do nas pytanie? Wspomnij o tym w sekcji komentarzy, a my skontaktujemy się z Tobą.
Powiązane posty:
różnica między hashmap i hashtable