Увод у Придруживање карте у кошници
Придруживање карте је функција која се користи у кошницама да би се повећала њена ефикасност у погледу брзине. Придруживање је услов који се користи за комбиновање података из 2 табеле. Дакле, када изведемо нормално спајање, посао се шаље задатку Редуцирање мапе који главни задатак дели на 2 фазе - „Стадиј карте“ и „Смањивање фазе“. Ступањ Мап интерпретира улазне податке и враћа излаз у фазу редукције у облику парова кључ-вриједност. Следећи корак пролази кроз фазу мешања где су разврстани и комбиновани. Редуктор узима ову сортирану вредност и довршава посао спајања.
Табела се може убацити у меморију у потпуности унутар мапе и без употребе процеса Мап / Редуцтор. Чита податке из мање табеле и смешта их у хеш табелу у меморији, а затим их сериализује у датотеку хеш меморије чиме значајно смањује време. Такође је позната као Мап Сиде Јоин ин кошница. У основи, то укључује извођење спајања између 2 табеле коришћењем само фазе Мап и прескакањем фазе Редуце. Може се приметити временско смањење израчуна ваших упитака ако они редовно користе мале таблице за спајање.
Синтакса за придруживање карте у кошници
Ако желимо да извршимо упит за придруживање користећи придруживање мапе, морамо у изјави као ниже навести кључну реч „/ * + МАПЈОИН (б) * /“:
>SELECT /*+ MAPJOIN(c) */ * FROM tablename1 t1 JOIN tablename2 t2 ON (t1.emp_id = t2.emp_id);
За овај пример, морамо да направимо две табеле са именима наменаме1 и табленаме2 које имају 2 ступца: емп_ид и емп_наме. Једна би требала бити већа датотека, а друга мања.
Пре него што покренемо упит, морамо да доле наведено својство поставимо на тачно:
hive.auto.convert.join=true
Упит за придруживање карте је написан као горе, а резултат који добијамо је:
Упит је завршен за 1.351 секунди.
Примери придруживања карте у кошници
Ево следећих примера који се спомињу у наставку
1. Пример придруживања мапе
За овај пример направимо 2 табеле под називом табле1 и табле2 са 100 и 200 записа. За наредбу исте можете упутити наредбу и снимке екрана:
>CREATE TABLE IF NOT EXISTS table1 ( emp_id int, emp_name String, email_id String, gender String, ip_address String) row format delimited fields terminated BY ', ' tblproperties("skip.header.line.count"="1");
>CREATE TABLE IF NOT EXISTS table2 ( emp_id int, emp_name String) row format delimited fields terminated BY ', ' tblproperties("skip.header.line.count"="1");
Сада учитавамо записе у обе табеле користећи наредбе испод:
>load data local inpath '/relativePath/data1.csv' into table table1;
>load data local inpath '/relativePath/data2.csv' into table table2;
Извршимо уобичајен упит за придруживање мапи на њиховим идентификационим бројевима као што је приказано у наставку и проверимо време потребно за исто:
>SELECT /*+ MAPJOIN(table2) */ table1.emp_name, table1.emp_id, table2.emp_id FROM table1 JOIN table2 ON table1.emp_name = table2.emp_name;
Као што видимо, нормалан упит за придруживање мапи требало је 12.521 секунди.
2. Пример придруживања кашике карата
Користимо сада да се Буцкет-мап придружи за извођење истог. Постоји неколико ограничења која треба да се придржавају за канту:
- Копче се могу међусобно спајати само ако је укупна канта било које једне табеле вишеструка од броја кашика у другој табели.
- За обављање канте морају имати закопане столове. Отуда нека креирамо исто.
Следе наредбе које се користе за прављење сабраних табела табле1 и табле2:
>>CREATE TABLE IF NOT EXISTS table1_buk (emp_id int, emp_name String, email_id String, gender String, ip_address String) clustered by(emp_name) into 4 buckets row format delimited fields terminated BY ', ';
>CREATE TABLE IF NOT EXISTS table2_buk ( emp_id int, emp_name String) clustered by(emp_name) into 8 buckets row format delimited fields terminated BY ', ' ;
У ове избачене табеле ћемо такође уметнути исте записе из табеле1:
>insert into table1_buk select * from table1;
>insert into table2_buk select * from table2;
Сада када имамо наше 2 табеле са укопчаним групама, учинимо их да се придруже мапи кашике. Прва таблица садржи 4 канте док друга има 8 канти креираних у истој колони.
Да би упит за придруживање кашике карата могао да функционише, требало би да поставимо доле својство труе у кошници:
set hive.optimize.bucketmapjoin = true
>SELECT /*+ MAPJOIN(table2_buk) */ table1_buk.emp_name, table1_buk.emp_id, table2_buk.emp_id FROM table1_buk JOIN table2_buk ON table1_buk.emp_name = table2_buk.emp_name ;
Као што видимо, упит је завршен за 8.735 секунди што је брже од уобичајеног придруживања мапе.
3. Поредај пример придруживања мапе везива мапа (СМБ)
СМБ се може извести на букетним столовима који имају исти број канти и ако је потребно таложити и сортирати на ступовима придруживања. Маппер левел придружује се тим корпама на одговарајући начин.
Као и код придруживања Буцкет мап, постоје 4 канте за табле1 и 8 канти за табле2. За овај пример направићемо још једну табелу са 4 канте.
Да бисмо покренули СМБ упит, морамо да поставимо следећа својства кошнице као што је приказано у наставку:
Хиве.инпут.формат = орг.апацхе.хадооп.хиве.кл.ио.БуцкетизедХивеИнпутФормат;
хиве.оптимизе.буцкетмапјоин = труе;
хиве.оптимизе.буцкетмапјоин.сортедмерге = труе;
Да бисте извршили СМБ придруживање, потребно је да се подаци сортирају према ступовима за придруживање. Стога податке преписујемо у табелу 1 која је записана у наставку:
>insert overwrite table table1_buk select * from table1 sort by emp_name;
Подаци су сортирани сада, што се може видети на снимку слике испод:
Такође ћемо преписати податке у изрезану табелу2 као што следи:
>insert overwrite table table2_buk select * from table2 sort by emp_name;
Извршимо спајање за изнад 2 табеле на следећи начин:
>SELECT /*+ MAPJOIN(table2_buk) */ table1_buk.emp_name, table1_buk.emp_id, table2_buk.emp_id FROM table1_buk JOIN table2_buk ON table1_buk.emp_name = table2_buk.emp_name ;
Видимо да је упиту потрајало 10.165 секунди, што је поново боље него нормално спајање мапе.
Креирајмо другу таблицу за табле2 са 4 канте и истим подацима сортираним са ем_наме.
>CREATE TABLE IF NOT EXISTS table2_buk1 (emp_id int, emp_name String) clustered by(emp_name) into 4 buckets row format delimited fields terminated BY ', ' ;
>insert overwrite table table2_buk1 select * from table2 sort by emp_name;
С обзиром на то да сада имамо обе табеле са 4 канте, поново извршимо упит за придруживање.
>SELECT /*+ MAPJOIN(table2_buk1) */table1_buk.emp_name, table1_buk.emp_id, table2_buk1.emp_id FROM table1_buk JOIN table2_buk1 ON table1_buk.emp_name = table2_buk1.emp_name ;
Упит је заузео 8.851 секунди брже од уобичајеног упита за придруживање мапи.
Предности
- Спајање карата смањује време потребно за процесе сортирања и спајања који се одвијају у мешању и смањује фазе, смањујући на тај начин трошкове.
- Повећава ефикасност задатка.
Ограничења
- Иста табела / псеудоним није допуштено користити за спајање различитих ступаца у истом упиту.
- Упит за придруживање карте не може претворити Потпуна вањска спајања у придруживање на страни карте.
- Спајање карата се може извршити само када је једна од таблица довољно мала да се може уклопити у меморију. Дакле, не може се извести тамо где су подаци из табеле огромни.
- Лево спајање могуће је извести на придруживање мапи само када је десна величина таблице мала.
- Десно спајање могуће је извршити за придруживање мапи само када је величина леве табеле мала.
Закључак
Покушали смо укључити најбоље могуће тачке Мап Јоин ин Хиве. Као што смо видјели горе, спајање на страни карте најбоље функционира када једна табела има мање података, тако да посао брзо заврши. Вријеме потребно за овдје приказане упите овиси о величини скупа података, стога је овдје приказано вријеме само за анализу. Спајање карата се лако може имплементирати у апликацијама у реалном времену јер имамо огромне податке и на тај начин помажу у смањењу мрежног И / О промета.
Препоручени чланци
Ово је водич за Мап Јоин ин Хиве. Овде смо расправљали о примерима Мап Јоин у кошници заједно са предностима и ограничењима. Такође можете погледати следећи чланак да бисте сазнали више -
- Придружује се кошници
- Уграђене функције кошнице
- Шта је кошница?
- Команде за кошнице