Bucket in Hive: crea una tabella con bucket in Hive
Pubblicato: 2021-02-17Lavorare con un grande set di dati può essere difficile. C'è molto da tenere traccia e un piccolo errore può disturbare l'intero flusso di lavoro. Uno degli strumenti più importanti per la gestione di set di dati di grandi dimensioni è il bucket.
Questo articolo ti spiegherà come eseguire il bucket in Hive. Esploreremo più implementazioni di questa funzione attraverso esempi.
Sommario
Che cos'è il bucket in Hive?
Il bucket è una tecnica di organizzazione dei dati. Sebbene il partizionamento e il bucket in Hive siano concetti abbastanza simili, il bucket offre la funzionalità aggiuntiva di dividere set di dati di grandi dimensioni in set più piccoli e più gestibili chiamati bucket.
Con il bucket in Hive, puoi scomporre un set di dati di una tabella in parti più piccole, rendendole più facili da gestire. Il bucket consente di raggruppare tipi di dati simili e di scriverli in un unico file, migliorando le prestazioni durante l'unione di tabelle o la lettura dei dati. Questo è un grande motivo per cui utilizziamo il bucket con il partizionamento per la maggior parte del tempo.
Quando usiamo il bucket?
Il bucket è una funzionalità molto utile. Se non l'hai mai usato prima, dovresti tenere a mente i seguenti punti per determinare quando usare questa funzione:
- Quando una colonna ha una cardinalità elevata, non possiamo eseguire il partizionamento su di essa. Un numero molto elevato di partizioni genererà troppi file Hadoop che aumenterebbero il carico sul nodo. Questo perché il nodo dovrà conservare i metadati di ogni partizione e ciò influenzerebbe le prestazioni di quel nodo.
- Dovresti usare il bucket se le tue query hanno più join lato mappa. Un join lato mappa è un processo in cui si uniscono due tabelle utilizzando solo la funzione mappa senza utilizzare la funzione di riduzione.
Aspetti salienti del secchio in Hive
Il bucket si basa sulla funzione di hashing, quindi presenta i seguenti punti salienti:
- La funzione hash dipende dal tipo di colonna di bucket che hai.
- Tieni presente che i record con la stessa colonna con bucket verranno archiviati nello stesso bucket.
- Questa funzione richiede l'utilizzo della clausola Clustered By per dividere una tabella in bucket.
- Nella directory della tabella, la numerazione Bucket è basata su 1 e ogni bucket è un file.
- Il bucket è una funzione autonoma. Ciò significa che puoi eseguire il bucket senza eseguire il partizionamento su una tabella.
- Una tabella con bucket crea sezioni di file di dati quasi equamente distribuite.
- Tieni presente che il bucket non garantisce che la tua tabella venga popolata correttamente. Quindi dovrai gestire tu stesso il caricamento dei dati nei bucket, il che può essere ingombrante.
Leggi: Hive Vs Spark
Bucket in Hive: Esempio #1
Sarebbe meglio capire il bucket in Hive usando un esempio. Utilizzeremo i seguenti dati per il nostro esempio:
EMPID | NOME DI BATTESIMO | COGNOME | GLI SPORT | CITTÀ | NAZIONE |
1001 | Smeriglio | Blair | Pallacanestro | Qutubullapur | San Marino |
1002 | Zephr | Stephenson | Cricket | Neerharen | Repubblica Dominicana |
1003 | Autunno | Fagiolo | Pallacanestro | Neerharen | Repubblica Dominicana |
1004 | Kasimir | Vance | Badminton | Neerharen | Repubblica Dominicana |
1005 | Mufutau | Flores | Qutubullapur | San Marino | |
1006 | Ayanna | Banche | Calcio | Neerharen | Repubblica Dominicana |
1007 | Selma | Sfera | Tennis | Qutubullapur | San Marino |
1008 | Berk | Più pieno | Badminton | Neerharen | Repubblica Dominicana |
1009 | Imogene | Terrell | Qutubullapur | San Marino | |
1010 | Colorado | Hutchinson | Tennis | Qutubullapur | San Marino |
I nostri dati di esempio contengono informazioni sui dipendenti di una squadra sportiva. Tuttavia, alcuni dei dipendenti non fanno parte di alcun team.
Ecco i dati di esempio che puoi copiare e incollare per seguire insieme a questo esempio:
id,Nome,Cognome,Sport,Città,Paese
1001,Emerry, Blair, Basket, Qutubullapur, San Marino
1002, Zephr, Stephenson, Cricket, Neerharen, Repubblica Dominicana
1003, Autunno, Fagiolo, Basket, Neerharen, Repubblica Dominicana
1004, Kasimir, Vance, Badminton, Neerharen, Repubblica Dominicana
1005, Mufutau, Flores, Qutubullapur, San Marino
1006, Ayanna, Banche, Calcio, Neerharen, Repubblica Dominicana
1007,Selma,Palla,Tennis,Qutubullapur,San Marino
1008, Berk, Fuller, Badminton, Neerharen, Repubblica Dominicana
1009,Imogene,Terrell,,Qutubullapur,San Marino
1010,Colorado,Hutchinson,Tennis,Qutubullapur,San Marino
Sappiamo già che il bucket ci consente di raggruppare i set di dati in sezioni più piccole per l'ottimizzazione. Discutiamo ora come si completa questo processo:
Creazione del tavolo di base
Per prima cosa, creeremo una tabella chiamata employee_base:
CREA TABELLA db_bdpbase.employee_base (
INT empio,
nome STRINGA,
cognome STRINGA,
STRINGA sportiva,
città STRING,
STRINGA del paese
)
FORMATO DI RIGA DELIMITED
CAMPI TERMINATI DA ','
MEMORIZZATO COME FILE DI TESTO
TBLPROPERTIES(“skip.header.line.count”=”1”);
I nostri dati di esempio hanno un'intestazione che non è necessaria per il bucket, quindi la rimuoveremo aggiungendo la proprietà 'skip header'.
Caricamento dei dati nella tabella di base
Utilizzeremo la posizione '/usr/bdp/hive/sample_data.csv' per i nostri dati di esempio e utilizzeremo il seguente comando per caricarli nella tabella:
LOAD DATA INPATH '/user/bdp/hive/sample_data.csv' NELLA TABELLA db_bdpbase.employee_base;
Creazione della tabella con secchio
In questa sezione creeremo una tabella con bucket. Ora possiamo creare una tabella con bucket con una partizione o senza partizione.
Tavolo Secchi Con Divisorio
In questo caso, il paese è la colonna della partizione e abbiamo inserito in un bucket la colonna empid che abbiamo ordinato in ordine crescente:
CREA TABELLA db_bdpbase.bucketed_partition_tbl (
empid INT,
nome STRINGA,
cognome STRINGA,
STRINGA sportiva,
STRINGA città
) PARTIZED BY(stringa paese)
RAGGRUPPATO DA (vuoto)
ORDINATO PER (ASC vuoto) IN 4 SECCHI;
Tavolo con secchio senza partizione
In alternativa, possiamo creare una tabella con bucket senza partizione:
CREA TABELLA db_bdpbase.bucketed_tbl_only (
empid INT,
nome STRINGA,
cognome STRINGA,
città STRING,
STRINGA Paese
)
RAGGRUPPATO DA (vuoto)
ORDINATO PER (ASC vuoto) IN 4 SECCHI;
Qui, abbiamo inserito la tabella nella stessa colonna empid.
Impostazione della proprietà
L'impostazione predefinita per il bucket in Hive è disabilitata, quindi l'abbiamo abilitata impostandone il valore su true. La seguente proprietà selezionerebbe il numero dei cluster e dei riduttori in base alla tabella:
SET hive.enforce.bucketing=VERO; (NON necessario IN Hive 2.x in poi)
Caricamento dei dati nella tabella con bucket
Finora abbiamo creato due tabelle con bucket e una tabella di base con i nostri dati di esempio. Ora caricheremo i dati nella tabella con bucket dalla tabella di base utilizzando il seguente comando nella tabella con bucket con partizione:
INSERT OVERWRITE TABLE db_bdpbase.bucketed_partition_tbl PARTITION (paese) SELECT * FROM db_bdpbase.employee_base;
Per caricare i dati nella tabella con bucket senza alcuna partizione, utilizzeremo il comando seguente:
INSERT OVERWRITE TABLE db_bdpbase.bucketed_tbl_only SELECT * FROM db_bdpbase.employee_base;
Controllo dei dati della tabella in bucket
Dopo aver caricato i dati nella tabella con bucket, verificheremo come sono archiviati nell'HDFS. Utilizzeremo il codice seguente per controllare la tabella con bucket con partizione:
hadoop fs -ls hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/db_bdpbase.db/bucketed_partition_tbl
Archiviazione dei dati in tabelle con bucket
Ogni punto dati viene mappato su uno specifico in base alla seguente formula:
hash_function(bucket_column) modalità num_bucket
Ora, considera la prima tabella che abbiamo partizionato in base al paese, i nostri dati di esempio verranno suddivisi nelle seguenti sezioni:
EMPID | NOME DI BATTESIMO | COGNOME | GLI SPORT | CITTÀ | NAZIONE |
1002 | Zephr | Stephenson | Cricket | Neerharen | Repubblica Dominicana |
1003 | Autunno | Fagiolo | Pallacanestro | Neerharen | Repubblica Dominicana |
1004 | Kasimir | Vance | Badminton | Neerharen | Repubblica Dominicana |
1006 | Ayanna | Banche | Calcio | Neerharen | Repubblica Dominicana |
1008 | Berk | Più pieno | Badminton | Neerharen | Repubblica Dominicana |
EMPID | NOME DI BATTESIMO | COGNOME | GLI SPORT | CITTÀ | NAZIONE |
1001 | Smeriglio | Blair | Pallacanestro | Qutubullapur | San Marino |
1005 | Mufutau | Flores | Qutubullapur | San Marino | |
1007 | Selma | Sfera | Tennis | Qutubullapur | San Marino |
1009 | Imogene | Terrell | Qutubullapur | San Marino | |
1010 | Colorado | Hutchinson | Tennis | Qutubullapur | San Marino |
Per Repubblica Dominicana, ogni riga verrà archiviata nel bucket:
hash_function(1002) mode 4 = 2 (che rappresenta l'indice del bucket)
modalità funzione_hash(1003) 4 = 3
modalità funzione_hash(1004) 4 = 0
hash_function(1006) modalità 4 = 2
hash_function(1008) modalità 4 = 0
Nota che la funzione hash del valore INT ti darà lo stesso risultato. Puoi controllare i dati in ogni file nella posizione HDFS. Se lo desideri, puoi ripetere questa procedura per gli altri paesi presenti nel database.
Bucket in Hive: Esempio #2
Poiché abbiamo già trattato i vari passaggi e procedure presenti nell'implementazione di questa funzione, possiamo provarla facilmente. Quello che segue è un semplice esempio di bucket in Hive. Qui, abbiamo solo raggruppato i dati disponibili in parti diverse in modo da poterli gestire più facilmente:
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> crea una tabella month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> (mese char(7),fleet smallint,azienda varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> raggruppato per (azienda) in 3 bucket
. . . . . . . . . . . . . . . . . . . . . . .> memorizzato come avro;
Esempio utilizzando Apache Hive versione 1.1.0-cdh5.13.1, hive.enforce.bucketing=false per impostazione predefinita
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserisci in month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> seleziona mese,flotta,compagnia da month_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 aggiornamento hive 25483 2017-12-26 10:40 /user/hive/warehouse/monthly_taxi_fleet6/000000_0
— hive.enforce.bucketing: se il bucket è applicato. Se true, durante l'inserimento nella tabella, viene applicato il bucket.
— Valore predefinito: Hive 0.x: false, Hive 1.x: false, Hive 2.x: rimosso, il che lo rende effettivamente sempre vero (HIVE-12331)
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> imposta hive.enforce.bucketing=true;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserisci in month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> seleziona mese,flotta,compagnia da month_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 aggiornamento hive 13611 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000000_0
-rwxrwxrwt 1 aggiornamento hive 6077 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000001_0
-rwxrwxrwt 1 aggiornamento hive 6589 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000002_0
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> descrivi il mensile_taxi_fleet6 esteso;
+—————————–+——————————————————-+———-+–+
| nome_colo | tipo_dati | commenta |
+—————————–+——————————————————-+———-+–+
| mese | car(7) | |
| flotta | int | |
| azienda | varchar(50) | |
| | NULLA | NULLA |
| Informazioni dettagliate sulla tabella | 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(name:fleet, type:smallint, comment:null), FieldSchema(name:company, type:varchar(50), comment:null)], location: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, compress:false, numBuckets :3, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe, parametri:{serialization.format=1}), bucketCols:[azienda], sortCols:[], parametri :{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parametri:{totalSize=26277, numRows=1128, rawDataSize=0, COLUMN_STATS_ACCURATE =true, numFiles=3, tra nsient_lastDdlTime=1514256192}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) | |
+—————————–+——————————————————-+———-+–+
5 righe selezionate (0,075 secondi)
Checkout: domande di intervista di base sull'alveare
Bucket in Hive: Esempio #3
Di seguito è riportato un piccolo esempio avanzato di bucket in Hive. Qui, abbiamo eseguito il partizionamento e utilizzato la funzionalità Ordinato per per rendere i dati più accessibili. Questo è uno dei maggiori vantaggi del bucket. Puoi usarlo con altre funzioni per gestire grandi set di dati in modo più efficiente ed efficace.
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> crea una tabella month_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> (mese char(7),fleet smallint)
. . . . . . . . . . . . . . . . . . . . . . .> partizionato da (azienda varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> raggruppato per (mese) ordinato per (mese) in 3 bucket
. . . . . . . . . . . . . . . . . . . . . . .> memorizzato come avro;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserisci in month_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> partizione (azienda)
. . . . . . . . . . . . . . . . . . . . . . .> seleziona mese,flotta,compagnia da month_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet7
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000000_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000001_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000002_0
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort
-rwxrwxrwt 1 aggiornamento hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000000_0
-rwxrwxrwt 1 aggiornamento hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000001_0
-rwxrwxrwt 1 aggiornamento 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 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow-Top/000000_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow-Top/000001_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow-Top/000002_0
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000000_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000001_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000002_0
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime
-rwxrwxrwt 1 aggiornamento hive 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000000_0
-rwxrwxrwt 1 aggiornamento hive 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000001_0
-rwxrwxrwt 1 aggiornamento hive 766 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000002_0
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000000_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000001_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000002_0
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart
-rwxrwxrwt 1 aggiornamento hive 720 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000000_0
-rwxrwxrwt 1 aggiornamento hive 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000001_0
-rwxrwxrwt 1 aggiornamento hive 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000002_0
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000000_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000001_0
-rwxrwxrwt 1 aggiornamento hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000002_0
drwxrwxrwt – aggiornamento hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC
-rwxrwxrwt 1 aggiornamento hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000000_0
-rwxrwxrwt 1 aggiornamento hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000001_0
-rwxrwxrwt 1 aggiornamento hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000002_0
Ulteriori informazioni sul partizionamento e il bucket in Hive
Negli esempi che abbiamo condiviso in precedenza, abbiamo eseguito il partizionamento e il bucket in Hive in diversi modi e abbiamo appreso come implementarli in Hive. Tuttavia, Apache Hive ha molte altre funzionalità e conoscerle tutte può essere piuttosto scoraggiante.
Ecco perché ti consigliamo di seguire un corso di ingegneria dei dati. Ti permetterebbe di studiare da esperti del settore che hanno trascorso anni in questo settore. Un corso ti fornisce un curriculum strutturato in cui impari tutto passo dopo passo. In upGrad offriamo corsi di ingegneria dei dati dedicati .
Con i nostri corsi, accedi allo Student Success Corner di upGrad, dove ricevi feedback personalizzati sul curriculum, preparazione al colloquio, consulenza professionale e molti altri vantaggi.
Dopo il completamento del corso, sarai un professionista esperto di ingegneria dei dati.
Conclusione
Il bucket in Hive è molto semplice e facile da eseguire. È sicuramente una funzione utile per set di dati di grandi dimensioni. Tuttavia, quando esegui insieme il partizionamento e il bucket in Hive, puoi gestire molto facilmente set di dati abbastanza enormi.
Se sei interessato a saperne di più sul programma Big Data, dai un'occhiata al nostro PG Diploma in Software Development Specialization nel programma Big Data, progettato per professionisti che lavorano e fornisce oltre 7 casi di studio e progetti, copre 14 linguaggi e strumenti di programmazione, mani pratiche sui workshop, oltre 400 ore di rigoroso apprendimento e assistenza all'inserimento lavorativo con le migliori aziende.
Se hai domande o pensieri sul bucket, condividili nei commenti qui sotto. Ci piacerebbe sentirti.
Controlla i nostri altri corsi di ingegneria del software su upGrad.