Bucket in Hive: crea una tabella con bucket in Hive

Pubblicato: 2021-02-17

Lavorare 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.

Migliora le tue competenze e preparati per il futuro

Programma di certificazione avanzato in Big Data da IIIT Bangalore