A classe abstrata StoreFunc possui os principais métodos para armazenar dados e, para a maioria dos casos de uso, deve bastar estendê-los. Há uma interface opcional que pode ser implementada para obter funcionalidade estendida:
StoreMetadata
Essa interface possui métodos para interagir com sistemas de metadados para armazenar esquemas e estatísticas. Essa interface é opcional e deve ser implementada apenas se os metadados precisarem ser armazenados.
Os métodos que precisam ser substituídos em StoreFunc são explicados abaixo:
getOutputFormat ():
Este método será chamado pelo Pig para obter o OutputFormat usado pelo Armazenador. Os métodos no OutputFormat serão chamados pelo Pig da mesma maneira e no mesmo contexto que pelo Hadoop em um programa Java de redução de mapa. Se o OutputFormat for um pacote Hadoop, a implementação deve usar a nova API baseada em org.apache.hadoop.mapreduce. Se for um OutputFormat personalizado, ele deve ser implementado usando a nova API em org.apache.hadoop.mapreduce. O método checkOutputSpecs () de OutputFormat será chamado por pig para verificar o local de saída antecipadamente. Este método também será chamado como parte da sequência de chamadas do Hadoop quando o trabalho for iniciado. Portanto, as implementações devem garantir que esse método possa ser chamado várias vezes sem efeitos colaterais inconsistentes.
setStoreLocation ():
Este método é chamado pelo Pig para comunicar a localização da loja ao armazenador. O armazenador deve usar esse método para comunicar as mesmas informações ao OutputFormat subjacente. Este método é chamado várias vezes pelo Pig. As implementações devem observar que esse método é chamado várias vezes e deve garantir que não haja efeitos colaterais inconsistentes devido às várias chamadas.
prepareToWrite ():
Na nova API, a gravação dos dados é feita por meio do OutputFormat fornecido pelo StoreFunc. Em prepareToWrite (), o RecordWriter associado ao OutputFormat fornecido pelo StoreFunc é passado para o StoreFunc. O RecordWriter pode então ser usado pela implementação em putNext () para escrever uma tupla representando um registro de dados da maneira esperada pelo RecordWriter.
putNext ():
O significado de putNext () não mudou e é chamado pelo tempo de execução do Pig para gravar a próxima tupla de dados - na nova API, este é o método em que a implementação usará o RecordWriter subjacente para gravar a Tupla.
Implementações padrão em StoreFunc:
setStoreFuncUDFContextSignature ():
Este método será chamado pelo Pig no front end e no back end para passar uma assinatura exclusiva para o Armazenador. A assinatura pode ser usada para armazenar qualquer informação no UDFContext que o Armazenador precise armazenar entre várias invocações de método no front end e back end. A implementação padrão em StoreFunc possui um corpo vazio. Este método será chamado antes de qualquer outro método.
relToAbsPathForStoreLocation ():
O tempo de execução do Pig chamará esse método para permitir que o Armazenador converta um local de armazenamento relativo em um local absoluto. Uma implementação é fornecida em StoreFunc que lida com isso para locais baseados em FileSystem.
checkSchema ():
Uma função Store deve implementar essa função para verificar se um determinado esquema que descreve os dados a serem gravados é aceitável para ela. A implementação padrão em StoreFunc possui um corpo vazio. Este método será chamado antes de qualquer chamada para setStoreLocation ().
Exemplo de implementação:
A implementação do armazenador no exemplo é um armazenador para dados de texto com delimitador de linha como ‘
‘E‘ ‘como delimitador de campo padrão (que pode ser substituído passando um delimitador de campo diferente no construtor) - isso é semelhante ao armazenador PigStorage atual no Pig. A implementação usa um OutputFormat - TextOutputFormat compatível com Hadoop existente como o OutputFormat subjacente.
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 delimitador) {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 deve ser caractere único ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) lança IOException {int sz = f.size () para (int i = 0 iTem alguma questão para nós? Mencione-os na seção de comentários e entraremos em contato com você.
redondo duplo para int javaPostagens relacionadas: