Apache Pig UDF: Част 1 - Функции за изравняване, агрегиране и филтриране



Тази публикация описва за Apache Pig UDF - Функции за изравняване, агрегиране и филтриране. Разгледайте функциите Eval, Aggregate & Filter.

ширина първо алгоритъм за търсене псевдокод

Apache Pig предоставя широка поддръжка за дефинирани от потребителя функции (UDF) като начин за задаване на персонализирана обработка. Понастоящем UDF на прасета могат да бъдат изпълнени на три езика: Java, Python, JavaScript и Ruby. Най-обширната поддръжка се предоставя за функции на Java.





Java UDF могат да бъдат извикани по множество начини. Най-простият UDF може просто да разшири EvalFunc, което изисква само изпълнението на функцията exec. Всеки СД на Eval трябва да приложи това. Освен това, ако дадена функция е алгебрична, тя може да внедри алгебричен интерфейс, за да подобри значително производителността на заявката.

Значението на СДС в свинята:

Pig позволява на потребителите да комбинират съществуващи оператори със собствен или чужд код чрез UDF. Предимството на Pig е способността му да позволява на потребителите да комбинират своите оператори със собствения си или чужд код чрез UDF. До версия 0.7, всички UDF трябва да бъдат написани на Java и са внедрени като Java класове. Това улеснява добавянето на нови UDF към Pig, като пише Java клас и информира Pig за JAR файла.



Самото прасе идва с някои СДС. Преди версия 0.8, това беше много ограничен набор само със стандартните обобщени функции на SQL и няколко други. В 0.8 бяха добавени голям брой стандартни UDF за обработка на низове, математика и сложен тип.

Какво е Piggybank?

Piggybank е колекция от предоставени от потребителя СДС, която се пуска заедно с Pig. UDF на Piggybank не са включени в PAR JAR, така че трябва да ги регистрирате ръчно във вашия скрипт. Можете също да пишете свои собствени UDF или да използвате тези, написани от други потребители.

Функции на Eval

Класът UDF разширява класа EvalFunc, който е основата за всички функции на Eval. Всички функции за оценка разширяват Java класа ‘org.apache.pig.EvalFunc. ‘Параметризира се с типа на връщане на UDF, който в този случай е Java String. Основният метод в този клас е ‘exec.’ 1-ви ред на кода показва, че функцията е част от пакета myudfs.



Отнема един запис и връща един резултат, който ще бъде извикан за всеки запис, който минава през тръбопровода за изпълнение. Отнема кортеж, който съдържа всички полета, които скриптът предава на вашия UDF като вход. След това връща типа, по който сте параметризирали EvalFunc.

Тази функция се извиква на всеки входен кортеж. Входът във функцията е кортеж с входни параметри в реда, в който се предават на функцията в Pig скрипта. В примера, показан по-долу, функцията приема низ като вход. Следващата функция преобразува низа от малки букви в главни. Сега, когато функцията е реализирана, тя трябва да бъде компилирана и включена в JAR.

какво е готвач и кукла
пакет myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple публичен клас UPPER разширява EvalFunc {public String exec (Tuple input) хвърля IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {хвърли нов IOException ('Уловена обработка на изключение ред за вход', д)}}}

Обобщени функции:

Обобщените функции са друг често срещан тип функции на Eval. Обобщените функции обикновено се прилагат към групирани данни. Функцията агрегат взема чанта и връща скаларна стойност. Интересна и ценна характеристика на много агрегатни функции е, че те могат да се изчисляват постепенно по разпределен начин. В света на Hadoop това означава, че частичните изчисления могат да се извършват от Map и Combiner, а крайният резултат може да се изчислява от Редуктора.

Много е важно да се уверите, че агрегираните функции, които са алгебрични, са внедрени като такива. Примери за този тип включват вградените COUNT, MIN, MAX и AVERAGE.

БРОЯ е пример за алгебрична функция, при която можем да преброим броя на елементите в подмножество от данни и след това да сумираме броя, за да получим краен изход. Нека да разгледаме изпълнението на функцията COUNT:

публичен клас COUNT се разширява EvalFunc изпълнява алгебричен {публичен Long exec (Tuple вход) хвърля IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} public String getFinal () {return Final.class.getName ()} static public class Initial extends EvalFunc {public Tuple exec (Tuple input) хвърля IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} статичен публичен клас Intermed разширява EvalFunc {публичен Tuple exec (Tuple input) хвърля IOException {return TupleFactory.getInstance (). newTuple (сума (вход))}} static public class Final extends EvalFunc {public Tuple exec (Tuple input) хвърля IOException {return sum (input)}} статично защитен Long count (Tuple input) хвърля ExecException {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () else if (values instanceof Map) връща нови Long (((Map) стойности) .size ())} статично защитени Long sum (Tuple i nput) хвърля ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) long sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} сума за връщане}}

COUNT изпълнява алгебричен интерфейс, който изглежда така:

публичен интерфейс Алгебричен {публичен низ getInitial () публичен низ getIntermed () публичен низ getFinal ()}

За да бъде алгебрична функция, тя трябва да внедри алгебричен интерфейс, който се състои от дефиниция на три класа, получени от EvalFunc. Договорът е, че екзекфункцията на първоначалния клас се извиква веднъж и се предава на оригиналния входен кортеж. Изходът му е кортеж, който съдържа частични резултати. Функцията exec на клас Intermed може да бъде извикана нула или повече пъти и приема за свой вход кортеж, който съдържа частични резултати, получени от началния клас или от предходни извиквания на класа Intermed и създава кортеж с друг частичен резултат. И накрая, exec функцията на клас Final се извиква и дава крайния резултат като скаларен тип.

Функции на филтъра:

Функциите за филтриране са функции на Eval, които връщат булева стойност. Може да се използва навсякъде, където е подходящ булев израз, включително оператора FILTER или Bincond израз. Apache Pig не поддържа напълно Boolean, така че функциите за филтриране не могат да се появяват в изрази като ‘Foreach’, където резултатите се извеждат на друг оператор. Функциите за филтриране обаче могат да се използват в оператори за филтриране.

Примерът по-долу реализира функцията IsEmpty:

import java.io.IOException import java.util.Map import org.apache.pig.FilterFunc import org.apache.pig.PigException import org.apache.pig.backend.executionengine.ExecException import org.apache.pig.data.DataBaga import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * Определете дали чантата или картата са празни. * / публичен клас IsEmpty разширява FilterFunc {@Override публичен булев exec (Tuple input) хвърля IOException {try {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () == 0 else if (values ​​instanceof Map) return ((Map) values) .size () == 0 else {int errCode = 2102 String msg = 'Не може да се тества' + DataType.findTypeName (стойности) + 'за празнота.' хвърли нов ExecException (msg, errCode, PigException.BUG)}} catch (ExecException ee) {throw ee}}}