Apache Pig UDF: Část 2 - Funkce načítání



Tento příspěvek popisuje funkce Apache Pig UDF - Load. (Apache Pig UDF: Part 2). Podívejte se na funkce načítání Apache Pig UDF.

Dnešní příspěvek je o funkcích Load v Apache Pig. Toto je pokračování první příspěvek které pokrývaly funkce UDF jako Eval, Filter a Aggregate. Prosím, opakujte jim další informace o dalších funkcích Pig UDF.





Funkce načtení prasete je postavena na Hadoopově InputFormatu, třídě, kterou Hadoop používá ke čtení dat. InputFormat má dva účely: Určuje, jak bude vstup fragmentován mezi mapovými úkoly, a poskytuje RecordReader, jehož výsledkem jsou páry klíč-hodnota jako vstup do těchto mapových úkolů. Základní třída pro funkci načítání je LoadFunc.

Funkce zatížení - klasifikace:

LoadFunc abstraktní třída má tři hlavní metody pro načítání dat a ve většině případů by to stačilo rozšířit. Existují tři další volitelná rozhraní, která lze implementovat pro dosažení rozšířené funkce:



co je abstrakce v Javě s příkladem
  • LoadMetadata:

LoadMetadata má metody řešení metadat. Většina provádění zavaděčů to nemusí implementovat, pokud nebudou pracovat se systémem metadat. Metoda getSchema () v tomto rozhraní nabízí způsob, jak implementace zavaděče komunikovat o schématu dat zpět na Pig. Pokud implementace zavaděče vrací data složená z polí skutečných typů, měla by poskytnout schéma popisující data vrácená metodou getSchema (). Ostatní metody se zabývají jinými typy metadat, jako jsou klíče oddílů a statistiky. Implementace mohou pro tyto metody vrátit nulové návratové hodnoty, pokud nejsou platné pro jinou implementaci.

  • LoadPushDown:

LoadPushDown má různé metody pro odesílání operací z modulu runtime Pig do implementací zavaděče. V současné době je Pig volána pouze metoda pushProjection () pro komunikaci s zavaděčem, přesná pole, která jsou vyžadována ve skriptu Pig. Implementace zavaděče se může rozhodnout, zda vyhoví nebo nesplní požadavek. Pokud se implementace zavaděče rozhodne vyhovět požadavku, měla by implementovat LoadPushDown ke zlepšení výkonu dotazu.

  • pushProjection ():

Tato metoda informuje LoadFunc, která pole jsou ve skriptu Pig povinná. Díky tomu může funkce LoadFunc zvýšit výkon načtením pouze požadovaných polí. pushProjection () přebírá „requiredFieldList“. „requiredFieldList“ je pouze pro čtení a nelze jej pomocí LoadFunc změnit. ‚RequiredFieldList 'zahrnuje seznam‚ requiredField', kde každý ‚requiredField 'označuje pole požadované skriptem Pig a skládá se z indexu, aliasu, typu a dílčích polí. Pig používá index sloupce requiredField.index ke komunikaci s LoadFunc o polích požadovaných skriptem Pig. Pokud je požadovaným polem mapa, Pig předá „requiredField.subFields“, který obsahuje seznam klíčů požadovaných skripty Pig pro mapu.



míchání dat v tabulce 10
  • LoadCaster:

LoadCaster má techniky pro převod bajtových polí na konkrétní typy. Implementace zavaděče by to měla implementovat, když je třeba podporovat implicitní nebo explicitní přetypování z polí DataByteArray na jiné typy.

Abstraktní třída LoadFunc je hlavní třída, kterou lze rozšířit pro implementaci zavaděče. Níže jsou vysvětleny metody, které je třeba přepsat:

jak převrátit číslo v javě
  • getInputFormat ():

    Tuto metodu volá Pig, aby získal InputFormat využívaný zavaděčem. Metody v InputFormatu volá Pig stejným způsobem jako Hadoop v programu MapReduce Java. Pokud je InputFormat zabalený v Hadoopu, implementace by měla používat nový založený na API, pod org.apache.hadoop.mapreduce. Pokud se jedná o vlastní InputFormat, je lepší být implementován pomocí nového API v org.apache.hadoop.mapreduce.

  • setLocation ():

    Tuto metodu volá Pig, aby sdělil místo zatížení nakladači. Zavaděč potřebuje tuto metodu použít ke komunikaci stejných informací s jádrem InputFormat. Tato metoda se nazývá prase několikrát.

  • prepareToRead ():

    V této metodě je RecordReader související s InputFormat poskytnutým LoadFunc předán LoadFunc. RecordReader lze nyní použít implementací v getNext () k vrácení n-tice představující záznam dat zpět na Pig.

  • getNext ():

    Význam getNext () se nezměnil a je volán modulem Pig runtime k získání další n-tice v datech. V této metodě by implementace měla používat podkladový RecordReader a vytvořit n-tici pro návrat.

Výchozí implementace v LoadFunc:

Vezměte na vědomí, že výchozí implementace v LoadFunc by měla být přepsána pouze v případě potřeby.

  • setUdfContextSignature ():

    Tuto metodu bude volat Pig, a to jak na front-endu, tak na back-endu, aby se předal jedinečný podpis Loaderu. Podpis lze použít k uložení jakýchkoli informací do UDFContext, které Loader potřebuje k ukládání mezi různými vyvoláními metod v rozhraní front-end a back-end. Případem použití je uložení RequiredFieldList předaného do něj v LoadPushDown.pushProjection (RequiredFieldList) pro použití v zadní části před vrácením n-tic v getNext (). Výchozí implementace v LoadFunc má prázdné tělo. Tato metoda bude volána před jinými metodami.

  • relativeToAbsolutePath ():

    Pig runtime zavolá tuto metodu, aby umožnil zavaděči převést relativní umístění zatížení na absolutní umístění. Výchozí implementace poskytnutá v LoadFunc to zpracovává pro umístění FileSystem. Pokud je zdrojem načítání něco jiného, ​​implementace zavaděče se může rozhodnout toto přepsat.

Implementací zavaděče v příkladu je zavaděč pro textová data s oddělovačem řádků jako „
„A“ „jako výchozí oddělovač polí podobný aktuálnímu zavaděči PigStorage v Pig. Implementace používá jako základní InputFormat existující Hadoop podporovaný Inputformat - TextInputFormat.

veřejná třída SimpleTextLoader rozšiřuje LoadFunc {chráněný RecordReader v = null soukromý bajt poleDel = '' soukromý ArrayList mProtoTuple = null soukromý TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {} {/ Nakladač prasat, který používá zadaný znak jako oddělovač pole. * * @param delimiter * jednobajtový znak, který se používá k oddělení polí. * ('' je výchozí.) * / public SimpleTextLoader (oddělovač řetězců) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) 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 () případ přerušení 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () přestávka výchozí: hodit nový RuntimeException ('Unknown delimiter' + delimiter)}} else {throw new RuntimeException ('PigStorage delimeter must be a single character')}} @Override public Tuple getNext () throws IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Textová hodnota = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 pro (int i = 0 iMáte na nás dotaz? Uveďte to prosím v sekci komentáře a my se vám ozveme. 

Související příspěvky: