Apache Pig UDF: Parte 2 - Funções de carga



Esta postagem descreve sobre o Apache Pig UDF - Funções de carga. (Apache Pig UDF: Parte 2). Dê uma olhada nas funções de carga do Apache Pig UDF.

declarar uma matriz de objetos em java

A postagem de hoje é sobre as funções de carregamento no Apache Pig. Esta é a sequela do primeiro post que abrangia funções UDF como Eval, Filter e Aggregate. Consulte-os para obter mais informações sobre outras funções do Pig UDF.





A função de carregamento do Pig é construída em cima do InputFormat do Hadoop, a classe que o Hadoop usa para ler dados. InputFormat tem dois propósitos: Ele determina como a entrada será fragmentada entre as tarefas do mapa e fornece um RecordReader que resulta em pares de valores-chave como entrada para essas tarefas do mapa. A classe base para a função de carregamento é LoadFunc.

Função de carga - Classificação:

A classe abstrata LoadFunc possui três métodos principais para carregar dados e, na maioria dos casos de uso, seria suficiente estendê-los. Existem três outras interfaces opcionais que podem ser implementadas para obter funcionalidade estendida:



  • LoadMetadata:

LoadMetadata possui métodos para lidar com metadados. A maioria dos carregadores de execução não precisa implementar isso, a menos que eles interajam com um sistema de metadados. O método getSchema () nesta interface oferece uma maneira para as implementações do carregador se comunicarem sobre o esquema dos dados de volta ao Pig. Se uma implementação de carregador retornar dados compostos de campos de tipos reais, ela deve fornecer o esquema que descreve os dados retornados por meio do método getSchema (). Os outros métodos lidam com outros tipos de metadados, como chaves de partição e estatísticas. As implementações podem retornar valores de retorno nulos para esses métodos se eles não forem válidos para a outra implementação.

  • LoadPushDown:

LoadPushDown tem métodos diferentes para enviar operações do tempo de execução do Pig para as implementações do carregador. Atualmente, apenas o método pushProjection () é chamado pelo Pig para comunicar ao carregador os campos exatos que são necessários no script do Pig. A implementação do carregador pode escolher aceitar ou não a solicitação. Se a implementação do carregador decidir aceitar a solicitação, ela deve implementar LoadPushDown para melhorar o desempenho da consulta.

  • pushProjection ():

Este método informa ao LoadFunc, quais campos são obrigatórios no script Pig. Assim, habilitando o LoadFunc para aprimorar o desempenho carregando apenas os campos que são obrigatórios. pushProjection () leva um ‘requiredFieldList’. ‘requiredFieldList’ é somente leitura e não pode ser alterado por LoadFunc. ‘RequiredFieldList’ inclui uma lista de ‘requiredField’, onde cada ‘requiredField’ indica um campo exigido pelo script Pig e é composto de índice, alias, tipo e subFields. O Pig usa o índice da coluna requiredField.index para se comunicar com o LoadFunc sobre os campos exigidos pelo script do Pig. Se o campo obrigatório for um mapa, o Pig passará ‘requiredField.subFields’, que contém uma lista de chaves exigidas pelos scripts Pig para o mapa.



o que é um daemon thread
  • LoadCaster:

O LoadCaster possui técnicas para converter matrizes de bytes em tipos específicos. Uma implementação de carregador deve implementar isso quando conversões implícitas ou explícitas de campos DataByteArray para outros tipos precisam ser suportadas.

A classe abstrata LoadFunc é a classe principal a ser estendida para implementar um carregador. Os métodos que devem ser substituídos são explicados abaixo:

  • getInputFormat ():

    Este método é chamado pelo Pig para obter o InputFormat utilizado pelo carregador. Os métodos no InputFormat são chamados pelo Pig da mesma maneira que o Hadoop em um programa MapReduce Java. Se o InputFormat for um pacote Hadoop, a implementação deve usar o novo baseado em API, em org.apache.hadoop.mapreduce. Se for um InputFormat personalizado, é melhor implementá-lo usando a nova API em org.apache.hadoop.mapreduce.

  • defina localização():

    Este método é chamado pelo Pig para comunicar o local de carregamento ao carregador. O carregador precisa usar este método para comunicar as mesmas informações ao InputFormat principal. Este método é chamado várias vezes por porco.

  • prepareToRead ():

    Neste método, o RecordReader relacionado ao InputFormat fornecido pelo LoadFunc é passado para o LoadFunc. O RecordReader agora pode ser usado pela implementação em getNext () para retornar uma tupla que representa um registro de dados de volta ao Pig.

  • getNext ():

    O significado de getNext () não mudou e é chamado pelo tempo de execução do Pig para adquirir a próxima tupla nos dados. Nesse método, a implementação deve usar o RecordReader subjacente e construir a tupla a ser retornada.

Implementações padrão em LoadFunc:

Observe que as implementações padrão em LoadFunc devem ser substituídas apenas quando necessário.

sobrecarregando vs substituindo c ++
  • setUdfContextSignature ():

    Este método será chamado pelo Pig, tanto no front end quanto no back end para passar uma assinatura exclusiva para o Loader. A assinatura pode ser utilizada para armazenar qualquer informação no UDFContext que o Loader precisa armazenar entre várias invocações de método no front end e back end. Um caso de uso é armazenar RequiredFieldList transmitido a ele em LoadPushDown.pushProjection (RequiredFieldList) para uso no backend antes de retornar tuplas em getNext (). A implementação padrão em LoadFunc possui um corpo vazio. Este método será chamado antes de outros métodos.

  • relativeToAbsolutePath ():

    O tempo de execução do Pig chamará esse método para permitir que o Loader converta um local de carregamento relativo em um local absoluto. A implementação padrão fornecida em LoadFunc lida com isso para locais FileSystem. Se a fonte de carregamento for outra, a implementação do carregador pode optar por substituir isso.

A implementação do carregador no exemplo é um carregador para dados de texto com delimitador de linha como ‘
‘E‘ ‘como delimitador de campo padrão semelhante ao carregador PigStorage atual no Pig. A implementação usa um Inputformat compatível com Hadoop existente - TextInputFormat - como InputFormat subjacente.

public class SimpleTextLoader extends 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 () {} / ** * Carregador de Pig que usa o caractere especificado como delimitador de campo. * * @param delimiter * o caractere de byte único usado para separar campos. * ('' é o padrão.) * / public SimpleTextLoader (String delimiter) {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 () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: throw new RuntimeException ('Delimitador desconhecido' + delimitador)}} else {lançar novo RuntimeException ('Delímetro PigStorage deve ser um único caractere')}} @Override public Tuple getNext () aciona IOException {try {boolean notDone = in.nextKeyValue () se (notDone) {return null} Text value = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iTem alguma questão para nós? Mencione isso na seção de comentários e entraremos em contato com você. 

Postagens relacionadas: