Apache Pig UDF: Част 2 - Функции за зареждане



Тази публикация описва за Apache Pig UDF - Функции за зареждане. (Apache Pig UDF: Част 2). Разгледайте функциите за зареждане на Apache Pig UDF.

Днешната публикация е за функциите за зареждане в Apache Pig. Това е продължението на първи пост които обхващаха функции на UDF като Eval, Filter и Aggregate. Моля, обърнете се към тях за повече информация относно други функции на Pig UDF.





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

какви са променливите на екземпляра в java

Функция на натоварване - Класификация:

Абстрактният клас LoadFunc има три основни метода за зареждане на данни и в повечето случаи би било достатъчно да ги разширите. Има три други незадължителни интерфейса, които могат да бъдат приложени за постигане на разширена функционалност:



  • LoadMetadata:

LoadMetadata има методи за справяне с метаданни. Повечето екзекутори на товарачи не трябва да изпълняват това, освен ако не взаимодействат със система от метаданни. Методът getSchema () в този интерфейс предлага начин за реализациите на товарача да комуникират за схемата на данните обратно към Pig. Ако изпълнението на товарач връща данни, състоящи се от полета от реални типове, то трябва да предостави схемата, описваща данните, върнати чрез метода getSchema (). Другите методи се занимават с други видове метаданни като дялове и статистически данни. Реализациите могат да върнат нулеви стойности за връщане за тези методи, ако не са валидни за другото изпълнение.

  • LoadPushDown:

LoadPushDown има различни методи за пренасочване на операции от Pig по време на изпълнение на loader. Понастоящем само методът pushProjection () се извиква от Pig, за да комуникира с товарача, точните полета, които се изискват в Pig скрипта. Реализацията на товарача може да избере да спазва или не спазва заявката. Ако изпълнението на товарача реши да изпълни заявката, то трябва да внедри LoadPushDown, за да подобри производителността на заявката.

  • pushProjection ():

Този метод информира LoadFunc, кои полета се изискват в Pig скрипта. По този начин дава възможност на LoadFunc да подобри производителността чрез зареждане само на полетата, които са задължителни. pushProjection () взема „requiredFieldList.“ „requiredFieldList“ е само за четене и не може да бъде променен от LoadFunc. „RequiredFieldList“ включва списък на „requiredField“, където всеки „requiredField“ посочва поле, изисквано от Pig скрипта и се състои от индекс, псевдоним, тип и подполета. Pig използва индекса на колоната requiredField.index, за да комуникира с LoadFunc за полетата, изисквани от Pig скрипта. Ако задължителното поле е карта, Pig ще премине ‘requiredField.subFields’, което съдържа списък с ключове, изисквани от Pig скриптове за картата.



урок за сървър на Microsoft SQL за начинаещи
  • LoadCaster:

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

Абстрактният клас LoadFunc е основният клас, който се разширява за внедряване на loader. Методите, които трябва да бъдат отменени, са обяснени по-долу:

  • getInputFormat ():

    Този метод се извиква от Pig, за да получи InputFormat, използван от товарача. Методите в InputFormat се извикват от Pig по същия начин като Hadoop в Java MapReduce програма. Ако InputFormat е пакетиран от Hadoop, внедряването трябва да използва новия API базиран под org.apache.hadoop.mapreduce. Ако това е персонализиран InputFormat, по-добре е да се внедри с помощта на новия API в org.apache.hadoop.mapreduce.

  • setLocation ():

    Този метод се извиква от Pig, за да съобщи местоположението на товара на товарача. Товарачът трябва да използва този метод, за да предаде същата информация на основния InputFormat. Този метод се извиква няколко пъти от свиня.

  • Подготовка за четене ():

    При този метод RecordReader, свързан с InputFormat, предоставен от LoadFunc, се предава на LoadFunc. RecordReader вече може да се използва от внедряването в getNext (), за да върне кортеж, представляващ запис на данни обратно в Pig.

  • getNext ():

    Значението на getNext () не се е променило и се извиква от Pig runtime за придобиване на следващия кортеж в данните. В този метод внедряването трябва да използва основния RecordReader и да изгради кортежа, който да се върне.

Реализации по подразбиране в LoadFunc:

Обърнете внимание, че изпълнението по подразбиране в LoadFunc трябва да бъде заменено само когато е необходимо.

  • setUdfContextSignature ():

    Този метод ще бъде извикан от Pig, както отпред, така и отзад, за да предаде уникален подпис на Loader. Подписът може да се използва за съхраняване на всякаква информация в UDFContext, която Loader трябва да съхранява между различни извиквания на методи в предния и задния край. Случаят на употреба е да съхранявате RequiredFieldList, предаден му в LoadPushDown.pushProjection (RequiredFieldList) за използване в задния край, преди да върнете кортежи в getNext (). Изпълнението по подразбиране в LoadFunc има празно тяло. Този метод ще бъде извикан преди други методи.

  • relativeToAbsolutePath ():

    Pig runtime ще извика този метод, за да позволи на Loader да преобразува относително място на натоварване в абсолютно местоположение. Реализацията по подразбиране, предоставена в LoadFunc, се справя с това за местоположенията на FileSystem. Ако източникът на зареждане е нещо друго, изпълнението на товарача може да реши да замени това.

Реализацията на loader в примера е loader за текстови данни с разделител на редове като ‘
‘И‘ ‘като разделител на поле по подразбиране, подобен на текущия PigStorage товарач в Pig. Внедряването използва съществуващ поддържан от Hadoop Inputformat - TextInputFormat - като основен InputFormat.

публичен клас SimpleTextLoader разширява LoadFunc {защитен RecordReader в = null частен байт fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoer * ContextLoad * Context { Pig loader, който използва определен символ като разделител на поле. * * @param разделител * еднобайтовият символ, който се използва за разделяне на полета. * ('' е по подразбиране.) * / public SimpleTextLoader (Разделител на низове) {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 ('Неизвестен разделител' + разделител)}} else {хвърли нов RuntimeException ('PigStorage делиметърът трябва да бъде един знак')}} @Override public Tuple getNext () хвърля IOException {try {boolean notDone = in.nextKeyValue () (notDone) {return null} Текстова стойност = (Текст) in.getCurrentValue () байт [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iИмате въпрос към нас? Моля, споменете го в раздела за коментари и ние ще се свържем с вас. 

Подобни публикации:

разлика между клас и интерфейс в Java