Apache Pig UDF: Часть 2 - Функции загрузки



В этом посте описывается Apache Pig UDF - функции загрузки. (Apache Pig UDF: Часть 2). Взгляните на функции загрузки Apache Pig UDF.

Сегодняшний пост посвящен функциям загрузки в Apache Pig. Это продолжение первый пост который охватывает такие функции UDF, как Eval, Filter и Aggregate. Пожалуйста, вернитесь к ним для получения дополнительной информации о других функциях Pig UDF.





Функция загрузки Pig построена на основе Hadoop InputFormat, класса, который Hadoop использует для чтения данных. InputFormat имеет две цели: он определяет, как входные данные будут фрагментированы между задачами карты, и предоставляет RecordReader, который приводит к парам ключ-значение в качестве входных данных для этих задач карты. Базовым классом для функции загрузки является LoadFunc.

Функция нагрузки - классификация:

В абстрактном классе LoadFunc есть три основных метода загрузки данных, и в большинстве случаев его достаточно расширить. Есть еще три дополнительных интерфейса, которые можно реализовать для расширения функциональности:



  • LoadMetadata:

LoadMetadata имеет методы для работы с метаданными. Большинству загрузчиков не нужно реализовывать это, если они не взаимодействуют с системой метаданных. Метод getSchema () в этом интерфейсе предлагает способ реализации загрузчика для передачи схемы данных обратно в Pig. Если реализация загрузчика возвращает данные, состоящие из полей реальных типов, она должна предоставить схему, описывающую данные, возвращаемые методом getSchema (). Другие методы работают с другими типами метаданных, такими как ключи разделов и статистика. Реализации могут возвращать нулевые возвращаемые значения для этих методов, если они недопустимы для другой реализации.

  • LoadPushDown:

LoadPushDown имеет разные методы для передачи операций из среды выполнения Pig в реализации загрузчика. В настоящее время Pig вызывает только метод pushProjection () для передачи загрузчику точных полей, которые требуются в сценарии Pig. Реализация загрузчика может выбрать, выполнять или не выполнять запрос. Если реализация загрузчика решает выполнить запрос, она должна реализовать LoadPushDown, чтобы повысить производительность запроса.

как запустить aws cli
  • pushProjection ():

Этот метод сообщает LoadFunc, какие поля необходимы в скрипте Pig. Таким образом, позволяя LoadFunc повысить производительность, загружая только необходимые поля. pushProjection () принимает «requiredFieldList». «requiredFieldList» доступен только для чтения и не может быть изменен с помощью LoadFunc. «RequiredFieldList» включает список «requiredField», где каждое «requiredField» указывает поле, требуемое сценарием Pig, и состоит из индекса, псевдонима, типа и подполей. Pig использует индекс столбца requiredField.index для связи с LoadFunc о полях, необходимых для сценария Pig. Если обязательным полем является карта, Pig передаст «requiredField.subFields», который содержит список ключей, требуемых скриптами Pig для карты.



  • LoadCaster:

В LoadCaster есть методы преобразования байтовых массивов в определенные типы. Реализация загрузчика должна реализовывать это, когда необходимо поддерживать неявное или явное приведение полей DataByteArray к другим типам.

Абстрактный класс LoadFunc - это основной класс, расширяемый для реализации загрузчика. Ниже описаны методы, которые необходимо переопределить:

  • getInputFormat ():

    Этот метод вызывается Pig, чтобы получить InputFormat, используемый загрузчиком. Методы в InputFormat вызываются Pig так же, как Hadoop в Java-программе MapReduce. Если InputFormat является упакованным в Hadoop, реализация должна использовать новый API, основанный на org.apache.hadoop.mapreduce. Если это настраиваемый InputFormat, лучше реализовать его с помощью нового API в org.apache.hadoop.mapreduce.

  • setLocation ():

    Этот метод вызывается Pig, чтобы сообщить загрузчику местоположение загрузки. Загрузчику необходимо использовать этот метод для передачи той же информации в основной InputFormat. Свинья вызывает этот метод несколько раз.

  • prepareToRead ():

    В этом методе RecordReader, связанный с InputFormat, предоставленным LoadFunc, передается в LoadFunc. RecordReader теперь может использоваться реализацией в getNext () для возврата кортежа, представляющего запись данных, обратно в Pig.

  • getNext ():

    Значение getNext () не изменилось и вызывается средой выполнения Pig для получения следующего кортежа в данных. В этом методе реализация должна использовать базовый RecordReader и создать кортеж для возврата.

Реализации по умолчанию в LoadFunc:

Обратите внимание, что реализации по умолчанию в LoadFunc следует переопределять только при необходимости.

план мониторинга и контроля проекта
  • setUdfContextSignature ():

    Этот метод будет вызываться Pig как во внешнем, так и во внутреннем интерфейсе, чтобы передать уникальную подпись загрузчику. Подпись может использоваться для хранения любой информации в UDFContext, которую Загрузчик должен сохранять между вызовами различных методов во внешнем и внутреннем интерфейсе. Пример использования - сохранить переданный ему RequiredFieldList в LoadPushDown.pushProjection (RequiredFieldList) для использования в серверной части перед возвратом кортежей в getNext (). Реализация по умолчанию в LoadFunc имеет пустое тело. Этот метод будет вызываться перед другими методами.

  • relativeToAbsolutePath ():

    Среда выполнения Pig вызовет этот метод, чтобы разрешить загрузчику преобразовать относительное местоположение загрузки в абсолютное местоположение. Реализация по умолчанию, представленная в LoadFunc, обрабатывает это для местоположений файловой системы. Если источником загрузки является что-то другое, реализация загрузчика может переопределить это.

Реализация загрузчика в примере - это загрузчик текстовых данных с разделителем строк как '
‘И‘ ‘как разделитель полей по умолчанию, аналогичный текущему загрузчику PigStorage в Pig. Реализация использует существующий формат ввода, поддерживаемый Hadoop, - TextInputFormat - в качестве базового формата ввода.

открытый класс SimpleTextLoader расширяет LoadFunc {защищенный RecordReader in = null закрытый байт fieldDel = '' закрытый ArrayList mProtoTuple = null закрытый TupleFactory mTupleFactory = TupleFactory.getInstance () частный статический окончательный int BUFFER_SIZE = 1024 общедоступный ** SimpleTextLoader () {} Загрузчик Pig, использующий указанный символ в качестве разделителя полей. * * @param delimiter * однобайтовый символ, используемый для разделения полей. * ('' по умолчанию.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {переключатель (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 single character')}} @Override public Tuple getNext () выбрасывает IOException {try {boolean notDone = in.nextKeyValue () если (notDone) {return null} Текстовое значение = (Текст) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iЕсть вопрос к нам? Пожалуйста, укажите это в комментариях, и мы свяжемся с вами. 

Похожие сообщения: