Апацхе Пиг УДФ: 1. део - Евал, агрегат и функције филтера



Овај пост описује Апацхе Пиг УДФ - функције евала, агрегата и филтера. Погледајте функције Евал, агрегат и филтер.

Апацхе Пиг пружа опсежну подршку за кориснички дефинисане функције (УДФ) као начин одређивања прилагођене обраде. УДФ-ови свиња тренутно се могу извршити на три језика: Јава, Питхон, ЈаваСцрипт и Руби. Најопсежнија подршка пружа се за Јава функције.





Јава УДФ-ови се могу позивати на више начина. Најједноставнији УДФ може само проширити ЕвалФунц, што захтева само имплементацију функције екец. Сваки Евал УДФ то мора применити. Поред тога, ако је функција алгебарска, може применити алгебарски интерфејс да би значајно побољшала перформансе упита.

Значај УДФ-ова за свиње:

Свиња омогућава корисницима да комбинују постојеће операторе са сопственим или туђим кодом путем УДФ-ова. Предност Пиг-а је његова способност да дозволи корисницима да комбинују његове операторе са сопственим или туђим кодом путем УДФ-ова. До верзије 0.7, сви УДФ-ови морају бити написани на Јави и имплементирани као Јава класе. Ово олакшава додавање нових УДФ-ова у Пиг писањем Јава класе и обавјештавањем Пиг-а о ЈАР датотеци.



Свиња сама долази са неким УДФ-овима. Пре верзије 0.8, био је врло ограничен скуп са само стандардним СКЛ обједињеним функцијама и неколико других. У 0.8 је додат велики број стандардних УДФ за обраду низова, математику и сложени тип.

Шта је Пиггибанк?

Пиггибанк је колекција корисничких УДФ-ова која се објављује заједно са Пиг-ом. УДФ-ови Пиггибанк нису укључени у Пиг ЈАР, тако да их морате ручно регистровати у својој скрипти. Такође можете писати сопствене УДФ-ове или користити оне које су написали други корисници.

Евал функције

Класа УДФ проширује класу ЕвалФунц која је основа за све функције Евал. Све функције процене проширују Јава класу ‘орг.апацхе.пиг.ЕвалФунц. ‘Параметрише се са повратним типом УДФ-а који је у овом случају Јава Стринг. Основна метода у овој класи је „екец.“ 1. ред кода означава да је функција део пакета миудфс.



претворити бинарни у инт јава

Потребан је један запис и враћа се један резултат, који ће се позивати за сваки запис који пролази кроз извршни цевовод. Потребна је корпица која садржи сва поља која скрипта прослеђује на ваш УДФ као улаз. Затим враћа тип помоћу којег сте параметрисали ЕвалФунц.

Ова функција се позива на сваком улазном корпусу. Улаз у функцију је скуп са улазним параметрима оним редоследом којим се прослеђују функцији у Пиг скрипти. У примеру приказаном доле, функција узима стринг као улаз. Следећа функција претвара низ из малог у велика слова. Сада када је функција имплементирана, треба је компајлирати и укључити у ЈАР.

пакет миудфс импорт јава.ио.ИОЕкцептион импорт орг.апацхе.пиг.ЕвалФунц импорт орг.апацхе.пиг.дата.Тупле јавна класа УППЕР проширује ЕвалФунц {публиц Стринг екец (Тупле инпут) баца ИОЕкцептион {иф (инпут == нулл || инпут.сизе () == 0) врати нулл три {Стринг стр = (Стринг) инпут.гет (0) ретурн стр.тоУпперЦасе ()} цатцх (Екцептион е) {тхров нев ИОЕкцептион ('Ухваћен изузетак обрађује улазни ред', е)}}}

Збирне функције:

Агрегатне функције су још један уобичајени тип Евал функција. Збирне функције се обично примењују на груписане податке. Функција агрегирања узима врећу и враћа скаларну вредност. Занимљива и драгоцена карактеристика многих агрегатних функција је да се могу рачунати постепено на дистрибуиран начин. У свету Хадооп-а то значи да делимична израчунавања могу вршити Мап анд Цомбинер, а коначни резултат може израчунати редуктор.

надјачавање и преоптерећење у јави

Веома је важно осигурати да се збирне функције које су алгебарске имплементирају као такве. Примери ове врсте укључују уграђене ЦОУНТ, МИН, МАКС и АВЕРАГЕ.

ЦОУНТ је пример алгебарске функције где можемо да избројимо број елемената у подскупу података, а затим збројимо бројеве да бисмо добили коначни излаз. Погледајмо имплементацију функције ЦОУНТ:

јавна класа ЦОУНТ се проширује ЕвалФунц имплементира Алгебарски {јавни Лонг екец (Тупле инпут) баца ИОЕкцептион {ретурн цоунт (инпут)} публиц Стринг гетИнитиал () {ретурн Инитиал.цласс.гетНаме ()} публиц Стринг гетИнтермед () {ретурн Интермед.цласс. гетНаме ()} публиц Стринг гетФинал () {ретурн Финал.цласс.гетНаме ()} статиц публиц цласс Инитиал ектендс ЕвалФунц {публиц Тупле екец (Тупле инпут) баца ИОЕкцептион {ретурн ТуплеФацтори.гетИнстанце (). невТупле (цоунт (инпут)) }} статичка јавна класа Интермед проширује ЕвалФунц {јавни Тупле екец (улаз увлаке) баца ИОЕкцептион {повратак ТуплеФацтори.гетИнстанце (). невТупле (зброј (улаз))}} статичка јавна класа Финал продужава ЕвалФунц {јавни извод извршења уноса (унос уноса) ИОЕкцептион {повратна сума (улаз)}} статички заштићен Лонг цоунт (Тупле инпут) баца ЕкецЕкцептион {Објецт валуес = инпут.гет (0) иф (валуес инстанцеоф ДатаБаг) ретурн ((ДатаБаг) валуес) .сизе () елсе иф (валуес инстанцеоф Мап) враћају нове Лонг (((Мап) вредности) .сизе ())} статички заштићене Лонг сум (Тупле и нпут) баца ЕкецЕкцептион, НумберФорматЕкцептион {ДатаБаг валуес = (ДатаБаг) инпут.гет (0) лонг сум = 0 фор (Итератор (Тупле) ит = валуес.итератор () ит.хасНект ()) {Тупле т = ит.нект ( ) сума + = (дуга) т.гет (0)} повратна сума}}

ЦОУНТ примењује алгебарски интерфејс који изгледа овако:

јавни интерфејс Алгебарски {јавни Стринг гетИнитиал () јавни Стринг гетИнтермед () јавни Стринг гетФинал ()}

Да би функција била алгебарска, потребно је да примени алгебарски интерфејс који се састоји од дефиниције три класе изведене из ЕвалФунц. Уговор је да се извршна функција почетне класе позива једном и прослеђује изворном улазном комплету. Његов излаз је скуп који садржи делимичне резултате. Екец функција класе Интермед може се позвати нула или више пута и узима за улаз улаз који садржи делимичне резултате произведене од почетне класе или претходних позива класе Интермед и даје корпус са другим делимичним резултатом. Коначно, позива се екец функција класе Финал и даје коначни резултат као скаларни тип.

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

Функције филтра су функције Евал које враћају логичку вредност. Може се користити било где где је прикладан логички израз, укључујући оператор ФИЛТЕР или Бинцонд израз. Апацхе Пиг не подржава логички логички, тако да се функције филтера не могу појавити у изразима као што је „Фореацх“, где се резултати преносе на други оператер. Међутим, функције филтера могу се користити у изразима филтера.

Следећи пример примењује функцију ИсЕмпти:

импорт јава.ио.ИОЕкцептион импорт јава.утил.Мап импорт орг.апацхе.пиг.ФилтерФунц импорт орг.апацхе.пиг.ПигЕкцептион импорт орг.апацхе.пиг.бацкенд.екецутионенгине.ЕкецЕкцептион импорт орг.апацхе.пиг.дата.ДатаБата импорт орг.апацхе.пиг.дата.Тупле импорт орг.апацхе.пиг.дата.ДатаТипе / ** * Утврдите да ли су торба или мапа празне. * / јавна класа ИсЕмпти проширује ФилтерФунц {@Оверриде јавни логички екец (Тупле инпут) баца ИОЕкцептион {три {Објецт валуес = инпут.гет (0) иф (валуес инстанцеоф ДатаБаг) ретурн ((ДатаБаг) валуес) .сизе () == 0 елсе иф (вредности инстанцеоф Мап) ретурн ((Мап) валуес) .сизе () == 0 елсе {инт еррЦоде = 2102 Стринг мсг = 'Није могуће тестирати' + ДатаТипе.финдТипеНаме (валуес) + 'на празнину.' баци нови ЕкецЕкцептион (мсг, еррЦоде, ПигЕкцептион.БУГ)}} цатцх (ЕкецЕкцептион ее) {тхров ее}}}