Apache Pig UDF: 3. časť - Funkcie obchodu



Tento príspevok popisuje funkciu Apache Pig UDF - funkcie obchodu. (Apache Pig UDF: časť 3). Zoznámte sa s funkciami obchodu Apache Pig UDF.

čo je trieda skenerov v Jave

Abstraktná trieda StoreFunc má hlavné metódy ukladania údajov a pre väčšinu prípadov použitia by ich stačilo rozšíriť. K dispozícii je voliteľné rozhranie, ktoré je možné implementovať na dosiahnutie rozšírenej funkčnosti:





StoreMetadata

Toto rozhranie obsahuje metódy interakcie so systémami metadát na ukladanie schém a štatistík. Toto rozhranie je voliteľné a malo by sa implementovať, iba ak je potrebné uložiť metadáta.

Metódy, ktoré je potrebné prepísať v StoreFunc, sú vysvetlené nižšie:



  • getOutputFormat ():

    Túto metódu zavolá Pig, aby získal výstupný formát, ktorý použije Storer. Metódy vo výstupnom formáte bude Pig volať rovnakým spôsobom a v rovnakom kontexte ako Hadoop v programe Java s redukciou mapy. Ak je OutputFormat zabalený v Hadoop, implementácia by mala používať nové založené na API pod org.apache.hadoop.mapreduce. Ak je to vlastný výstupný formát, mal by sa implementovať pomocou nového rozhrania API v rámci org.apache.hadoop.mapreduce. Metódu checkOutputSpecs () nástroja OutputFormat zavolá prasa, aby skontrolovala umiestnenie výstupu vopred. Táto metóda sa bude tiež nazývať ako súčasť sekvencie volaní Hadoop pri spustení úlohy. Implementácie by teda mali zabezpečiť, aby sa táto metóda dala zavolať viackrát bez nekonzistentných vedľajších účinkov.

  • setStoreLocation ():

    Túto metódu volá Pig na komunikáciu miesta skladu so skladom. Skladovateľ by mal použiť túto metódu na komunikáciu tých istých informácií s podkladovým OutputFormatom. Túto metódu nazýva Pig viackrát. Implementácie by mali brať na vedomie, že táto metóda sa volá viackrát, a mala by zabezpečiť, aby v dôsledku opakovaných hovorov nevznikli žiadne nekonzistentné vedľajšie účinky.

  • prepareToWrite ():

    V novom API sa dáta zapisujú pomocou OutputFormatu poskytnutého StoreFuncom. V PreparToWrite () sa RecordWriter spojený s OutputFormat poskytnutým StoreFunc odovzdá StoreFunc. Program RecordWriter potom môže implementácia v putNext () použiť na zápis n-tice predstavujúcej záznam údajov spôsobom očakávaným programom RecordWriter.

  • putNext ():

    Význam putNext () sa nezmenil a program Pig runtime ho volá na zápis ďalšej n-tice dát - v novom API je to metóda, pri ktorej implementácia použije na zápis n-tice podkladový RecordWriter.

Predvolené implementácie v StoreFunc:

  • setStoreFuncUDFContextSignature ():

    Túto metódu zavolá Pig v prednom aj zadnom konci, aby odovzdal jedinečný podpis skladovateľovi. Podpis je možné použiť na uloženie akýchkoľvek informácií do UDFContext, ktoré ukladač potrebuje na uloženie medzi rôznymi vyvolanými metódami v klientskom rozhraní a zadnom konci. Predvolená implementácia v StoreFunc má prázdne telo. Táto metóda sa bude volať pred ostatnými metódami.

  • relToAbsPathForStoreLocation ():

    Prasací runtime zavolá túto metódu, aby umožnil skladu prevádzať relatívne umiestnenie obchodu na absolútne miesto. Implementácia je poskytnutá v StoreFunc, ktorá túto prácu spracuje pre umiestnenia založené na FileSystem.

  • checkSchema ():

    Funkcia Store by mala implementovať túto funkciu na kontrolu toho, či je pre ňu prijateľná daná schéma popisujúca údaje, ktoré sa majú zapísať. Predvolená implementácia v StoreFunc má prázdne telo. Táto metóda bude volaná pred akýmikoľvek hovormi na setStoreLocation ().

Príklad implementácie:

Implementácia ukladača v príklade je ukladačom textových údajov s oddeľovačom riadkov ako „
„A“ „ako predvolený oddeľovač polí (ktorý je možné prepísať prechodom iného oddeľovača polí v konštruktore) - je to podobné ako v súčasnom ukladacom priestore PigStorage v programe Pig. Implementácia používa ako základný výstupný formát existujúci OutputFormat - TextOutputFormat podporovaný Hadoop.

public class SimpleTextStorer extends StoreFunc {protected RecordWriter writer = null private byte fieldDel = '' private static final int BUFFER_SIZE = 1024 private static final String UTF8 = 'UTF-8' public PigStorage () {} public PigStorage (String delimiter) {this ( ) if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if (delimiter.length ()> 1delimiter.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 a jeden znak ')}} ByteArrayOutputStream mOut = nový ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) hodí IOException {int sz = f.size () pre (int i = 0 i

Máte na nás otázku? Uveďte ich prosím v sekcii komentárov a my sa vám ozveme.

Súvisiace príspevky:



Apache Pig UDF: 2. časť
Apache Pig UDF: 1. časť