Bucketing in Hive: Creați Bucketed Table in Hive
Publicat: 2021-02-17Lucrul cu un set de date mare poate fi o provocare. Sunt multe de urmărit și o mică eroare vă poate perturba întregul flux de lucru. Unul dintre cele mai importante instrumente pentru gestionarea seturilor mari de date este gruparea.
Acest articol vă va spune despre cum puteți efectua bucketing în Hive. Vom explora mai multe implementări ale acestei funcții prin exemple.
Cuprins
Ce este Bucketing in Hive?
Bucketing-ul este o tehnică de organizare a datelor. În timp ce partiționarea și compartimentarea în Hive sunt concepte destul de asemănătoare, compartimentarea oferă funcționalitatea suplimentară de a împărți seturi de date mari în seturi mai mici și mai ușor de gestionat numite compartimente.
Cu compartimentarea în Hive, puteți descompune un set de date de tabel în părți mai mici, făcându-le mai ușor de gestionat. Bucketing vă permite să grupați tipuri de date similare și să le scrieți într-un singur fișier, ceea ce vă îmbunătățește performanța în timp ce vă conectați la tabele sau citiți date. Acesta este un motiv important pentru care folosim bucketing cu partiționare de cele mai multe ori.
Când folosim Bucketing?
Bucketing este o funcționalitate foarte utilă. Dacă nu l-ați folosit înainte, ar trebui să aveți în vedere următoarele puncte pentru a determina când să utilizați această funcție:
- Când o coloană are o cardinalitate mare, nu putem efectua partiţionarea pe ea. Un număr foarte mare de partiții va genera prea multe fișiere Hadoop, ceea ce ar crește sarcina pe nod. Asta pentru că nodul va trebui să păstreze metadatele fiecărei partiții, iar asta ar afecta performanța nodului respectiv.
- Ar trebui să utilizați compartimentarea dacă interogările dvs. au mai multe îmbinări pe hartă. O alăturare pe hartă este un proces în care uniți două tabele folosind doar funcția de hartă, fără a utiliza funcția de reducere.
Repere ale găleată în stup
Bucketing-ul se bazează pe funcția de hashing, așa că are următoarele aspecte:
- Funcția hash_function depinde de tipul de coloană de compartimentare pe care o aveți.
- Trebuie să rețineți că înregistrările cu aceeași coloană grupată vor fi stocate în aceeași grupă.
- Această funcție necesită să utilizați clauza Clustered By pentru a împărți un tabel în compartimente.
- În directorul tabelului, numerotarea compartimentului este bazată pe 1 și fiecare grupă este un fișier.
- Bucketing este o funcție independentă. Aceasta înseamnă că puteți efectua compartimentarea fără a efectua partiționarea pe o masă.
- Un tabel cu compartimente creează secțiuni de fișiere de date aproape egal distribuite.
- Rețineți că gruparea nu garantează că tabelul dvs. va fi populat corespunzător. Deci, va trebui să gestionați singur încărcarea datelor în compartimente, ceea ce poate fi greoi.
Citește: Hive Vs Spark
Bucketing în Hive: Exemplul #1
Cel mai bine ar fi să înțelegeți clapeta în Hive folosind un exemplu. Vom folosi următoarele date pentru exemplul nostru:
EMPID | NUME | NUMELE DE FAMILIE | SPORT | ORAȘ | ȚARĂ |
1001 | Emerry | Blair | Baschet | Qutubullapur | San Marino |
1002 | Zephr | Stephenson | Cricket | Neerharen | Republica Dominicană |
1003 | Toamnă | Fasole | Baschet | Neerharen | Republica Dominicană |
1004 | Kasimir | Vance | Badminton | Neerharen | Republica Dominicană |
1005 | Mufutau | Flores | Qutubullapur | San Marino | |
1006 | Ayanna | Băncile | Fotbal | Neerharen | Republica Dominicană |
1007 | Selma | Minge | Tenis | Qutubullapur | San Marino |
1008 | Berk | Mai plin | Badminton | Neerharen | Republica Dominicană |
1009 | Imogene | Terrell | Qutubullapur | San Marino | |
1010 | Colorado | Hutchinson | Tenis | Qutubullapur | San Marino |
Eșantionul nostru de date conține informații despre angajați pentru o echipă sportivă. Cu toate acestea, unii dintre angajați nu fac parte din nicio echipă.
Iată exemplele de date pe care le puteți copia și lipi pentru a le urma împreună cu acest exemplu:
id, Prenume, Prenume, Sport, Oraș, Țară
1001, Emerry, Blair, Baschet, Qutubullapur, San Marino
1002, Zephr, Stephenson, Cricket, Neerharen, Republica Dominicană
1003, Toamnă, Fasole, Baschet, Neerharen, Republica Dominicană
1004, Kasimir, Vance, Badminton, Neerharen, Republica Dominicană
1005, Mufutau, Flores, Qutubullapur, San Marino
1006, Ayanna, Banks, Fotbal, Neerharen, Republica Dominicană
1007, Selma, Minge, Tenis, Qutubullapur, San Marino
1008, Berk, Fuller, Badminton, Neerharen, Republica Dominicană
1009,Imogene,Terrell,,Qutubullapur,San Marino
1010, Colorado, Hutchinson, Tenis, Qutubullapur, San Marino
Știm deja că gruparea ne permite să grupăm seturile de date în secțiuni mai mici pentru optimizare. Să discutăm acum cum se finalizează acest proces:
Crearea tabelului de bază
Mai întâi, vom crea un tabel numit employee_base:
CREATE TABLE db_bdpbase.employee_base (
implid INT,
prenume STRING,
nume de familie STRING,
sport STRING,
orașul STRING,
țara STRING
)
FORMAT RÂND DELIMITAT
CÂMPURI TERMINATE DE „,”
STOCAT CA FIȘIER TEXT
TBLPROPERTIES(„skip.header.line.count”=”1”);
Datele noastre eșantion au un antet care nu este necesar pentru grupare, așa că îl vom elimina prin adăugarea proprietății „scrieți antetul”.
Încărcarea datelor în tabelul de bază
Vom folosi locația „/usr/bdp/hive/sample_data.csv” pentru datele noastre eșantion și vom folosi următoarea comandă pentru a o încărca în tabel:
ÎNCĂRCARE DATE INTRATH '/user/bdp/hive/sample_data.csv' ÎN TABEL db_bdpbase.employee_base;
Crearea tabelului cu găleți
În această secțiune, vom crea un tabel grupat. Acum putem fie să facem un tabel cu găleți cu o partiție, fie fără partiție.
Masă cu găleată cu despărțitor
În acest caz, țara este coloana de partiție și am grupat coloana empid pe care am sortat-o în ordine crescătoare:
CREATE TABLE db_bdpbase.bucketed_partition_tbl (
empid INT,
prenume STRING,
nume de familie STRING,
sport STRING,
orașul STRING
) PARTIȚIONAT DE(țara STRING)
CLUSTRATE DE (empid)
SORTAT DUPĂ (empid ASC) ÎN 4 GALEȚE;
Masă cu găleată fără compartimentare
Alternativ, putem crea un tabel cu compartimente fără partiție:
CREATE TABLE db_bdpbase.bucketed_tbl_only (
empid INT,
prenume STRING,
nume de familie STRING,
orașul STRING,
Țara STRING
)
CLUSTRATE DE (empid)
SORTAT DUPĂ (empid ASC) ÎN 4 GALEȚE;
Aici, am împărțit tabelul pe aceeași coloană empid.
Setarea proprietății
Setarea implicită pentru gruparea în Hive este dezactivată, așa că am activat-o setând valoarea acesteia la true. Următoarea proprietate ar selecta numărul de clustere și reductoare conform tabelului:
SET hive.enforce.bucketing=TRUE; (NU este necesar în Hive 2.x înainte)
Încărcarea datelor în tabelul cu compartimente
Până acum, am creat două tabele grupate și un tabel de bază cu datele noastre eșantion. Acum vom încărca datele în tabelul cu compartimente din tabelul de bază utilizând următoarea comandă în tabelul cu compartimente cu partiție:
INSERT OVERWRITE TABLE db_bdpbase.bucketed_partition_tbl PARTITION (țara) SELECT * FROM db_bdpbase.employee_base;
Pentru a încărca date în tabelul cu compartiment fără nicio partiție, vom folosi următoarea comandă:
INSERT OVERWRITE TABLE db_bdpbase.bucketed_tbl_only SELECT * FROM db_bdpbase.employee_base;
Verificarea datelor tabelului cu compartimente
După încărcarea datelor în tabelul cu compartimente, vom verifica cum sunt stocate în HDFS. Vom folosi următorul cod pentru a verifica tabelul cu compartimente cu partiție:
hadoop fs -ls hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/db_bdpbase.db/bucketed_partition_tbl
Stocarea datelor în tabele cu compartimente
Fiecare punct de date este mapat la un anumit, conform următoarei formule:
hash_function(bucket_column) mod num_bucket
Acum, luați în considerare primul tabel pe care l-am împărțit în funcție de țară, datele noastre eșantion vor fi împărțite în următoarele secțiuni:
EMPID | NUME | NUMELE DE FAMILIE | SPORT | ORAȘ | ȚARĂ |
1002 | Zephr | Stephenson | Cricket | Neerharen | Republica Dominicană |
1003 | Toamnă | Fasole | Baschet | Neerharen | Republica Dominicană |
1004 | Kasimir | Vance | Badminton | Neerharen | Republica Dominicană |
1006 | Ayanna | Băncile | Fotbal | Neerharen | Republica Dominicană |
1008 | Berk | Mai plin | Badminton | Neerharen | Republica Dominicană |
EMPID | NUME | NUMELE DE FAMILIE | SPORT | ORAȘ | ȚARĂ |
1001 | Emerry | Blair | Baschet | Qutubullapur | San Marino |
1005 | Mufutau | Flores | Qutubullapur | San Marino | |
1007 | Selma | Minge | Tenis | Qutubullapur | San Marino |
1009 | Imogene | Terrell | Qutubullapur | San Marino | |
1010 | Colorado | Hutchinson | Tenis | Qutubullapur | San Marino |
Pentru Republica Dominicană, fiecare rând va fi stocat în găleată:
hash_function(1002) modul 4 = 2 (Reprezentând indexul găleții)
hash_function(1003) modul 4 = 3
hash_function(1004) modul 4 = 0
hash_function(1006) modul 4 = 2
hash_function(1008) modul 4 = 0
Rețineți că hash_function a valorii INT vă va oferi același rezultat. Puteți verifica datele din fiecare fișier din locația HDFS. Dacă doriți, puteți repeta acest proces pentru alte țări prezente în baza de date.
Bucketing în Hive: Exemplul #2
Deoarece am acoperit deja diferiții pași și proceduri prezente în implementarea acestei funcții, o putem încerca cu ușurință. Următorul este un exemplu simplu de bucketing în Hive. Aici, am împărțit doar datele disponibile în diferite părți, astfel încât să le putem gestiona mai ușor:
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> creați tabelul lunar_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> (lună char(7),fleet smallint,company varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> grupate de (companie) în 3 găleți
. . . . . . . . . . . . . . . . . . . . . . .> stocat ca avro;
Exemplu folosind Apache Hive versiunea 1.1.0-cdh5.13.1, hive.enforce.bucketing=false în mod implicit
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserați în lunaly_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> selectați luna,flota,compania din luna_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 upgrad hive 25483 2017-12-26 10:40 /user/hive/warehouse/monthly_taxi_fleet6/000000_0
— hive.enforce.bucketing: Dacă este aplicată găleată. Dacă este adevărat, în timp ce se inserează în tabel, găleata este impusă.
— Valoare implicită: Hive 0.x: fals, Hive 1.x: false, Hive 2.x: eliminat, ceea ce îl face întotdeauna adevărat (HIVE-12331)
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> set hive.enforce.bucketing=true;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserați în lunaly_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> selectați luna,flota,compania din luna_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 upgrad hive 13611 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000000_0
-rwxrwxrwt 1 upgrad hive 6077 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000001_0
-rwxrwxrwt 1 upgrad hive 6589 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000002_0
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> descrie extinsly_taxi_fleet6;
+—————————–+—————————————————-+———-+–+
| col_name | tip_date | comentariu |
+—————————–+—————————————————-+———-+–+
| luna | char(7) | |
| flota | int | |
| firma | varchar(50) | |
| | NULL | NULL |
| Informații detaliate ale tabelului | Table(tableName:monthly_taxi_fleet6, dbName:default, owner:upgrad, createTime:1514256031, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:month, type:char(7), comment:null)) , FieldSchema(nume:flotă, tip:smallint, comentariu:null), FieldSchema(nume:company, tip:varchar(50), comentariu:null)], locație:hdfs://cdh-vm.dbaglobe.com:8020 /user/hive/warehouse/monthly_taxi_fleet6, inputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat, comprimat :3, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe, parametri:{serialization.format=1}), bucketCols:[company], sortCols:[], parametri :{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parametrii:{totalSize=2627Size=2627STATize=URCCATA=URD0_S_NUM_Row, URCCATA_S =true, numFiles=3, tra nsient_lastDdlTime=1514256192}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) | |
+—————————–+—————————————————-+———-+–+
5 rânduri selectate (0,075 secunde)
Checkout: Întrebări de bază pentru interviul Hive
Bucketing în Hive: Exemplul #3
Mai jos este un exemplu puțin avansat de bucketing în Hive. Aici, am efectuat partiționarea și am folosit funcționalitatea Sortat după pentru a face datele mai accesibile. Acesta este printre cele mai mari avantaje ale găleților. Îl puteți folosi împreună cu alte funcții pentru a gestiona seturi mari de date mai eficient și mai eficient.
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> creați tabelul lunar_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> (lună char(7),fleet smallint)
. . . . . . . . . . . . . . . . . . . . . . .> partiționat de (compania varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> grupat după (lună) sortat după (lună)în 3 găleți
. . . . . . . . . . . . . . . . . . . . . . .> stocat ca avro;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserați în lunaly_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> partiție (companie)
. . . . . . . . . . . . . . . . . . . . . . .> selectați luna,flota,compania din luna_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet7
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000000_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000001_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort
-rwxrwxrwt 1 upgrad hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000000_0
-rwxrwxrwt 1 upgrad hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000001_0
-rwxrwxrwt 1 upgrad hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000000_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000001_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000000_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000001_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime
-rwxrwxrwt 1 upgrad hive 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000000_0
-rwxrwxrwt 1 upgrad hive 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000001_0
-rwxrwxrwt 1 upgrad hive 766 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000000_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000001_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart
-rwxrwxrwt 1 upgrad hive 720 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000000_0
-rwxrwxrwt 1 upgrad hive 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000001_0
-rwxrwxrwt 1 upgrad hive 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000000_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000001_0
-rwxrwxrwt 1 upgrad hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000002_0
drwxrwxrwt – upgrad hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC
-rwxrwxrwt 1 upgrad hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000000_0
-rwxrwxrwt 1 upgrad hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000001_0
-rwxrwxrwt 1 upgrad hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000002_0
Aflați mai multe despre partiționare și compartimentare în Hive
În exemplele pe care le-am împărtășit anterior, am efectuat partiționarea și compartimentarea în Hive în mai multe moduri și am învățat cum le puteți implementa în Hive. Cu toate acestea, Apache Hive are multe alte funcționalități, iar învățarea despre toate acestea poate fi destul de descurajantă.
De aceea vă recomandăm să urmați un curs de inginerie a datelor. V-ar permite să studiați de la experți din industrie care au petrecut ani de zile în această industrie. Un curs vă oferă un curriculum structurat în care învățați totul pas cu pas. La upGrad, oferim cursuri dedicate de inginerie a datelor .
Cu cursurile noastre, aveți acces la Colțul pentru succesul studenților upGrad, unde obțineți feedback personalizat pentru CV, pregătire pentru interviuri, consiliere în carieră și multe alte avantaje.
După finalizarea cursului, vei fi un profesionist calificat în ingineria datelor.
Concluzie
Bucketing in Hive este foarte simplu și ușor de efectuat. Este cu siguranță o funcție utilă pentru seturi mari de date. Cu toate acestea, atunci când efectuați atât partiționarea, cât și compartimentarea în Hive împreună, puteți gestiona foarte ușor seturi de date destul de uriașe.
Dacă sunteți interesat să aflați mai multe despre Programul Big Data, consultați programul PG Diploma în Dezvoltare Software Specializare în Big Data, care este conceput pentru profesioniști care lucrează și oferă peste 7 studii de caz și proiecte, acoperă 14 limbaje și instrumente de programare, mâini practice. la ateliere, peste 400 de ore de asistență riguroasă de învățare și plasare a unui loc de muncă cu firme de top.
Dacă aveți întrebări sau păreri despre bucketing, împărtășiți-le în comentariile de mai jos. Ne-am bucura sa primim vesti de la tine.
Consultați celelalte cursuri ale noastre de inginerie software la upGrad.