Qual è la differenza tra partizionamento e bucketing di una tabella in Hive?

So che entrambi sono eseguiti su una colonna nella tabella, ma come è diversa ogni operazione.

I dati di partizionamento sono spesso usati per distribuire il carico in orizzontale, questo ha un vantaggio in termini di prestazioni e aiuta ad organizzare i dati in modo logico. Esempio : se abbiamo a che fare con una tabella dei employee grandi dimensioni e spesso eseguiamo query con clausole WHERE che limitano i risultati a un particolare paese o dipartimento. Per una risposta alle query più veloce, la tabella Hive può essere PARTITIONED BY (country STRING, DEPT STRING) . Le tabelle di partizionamento modificano il modo in cui Hive struttura l’archiviazione dei dati e ora Hive creerà sottodirectory che riflettono la struttura di partizionamento

… / dipendenti / paese = ABC / DEPT = XYZ .

Se i limiti di query per dipendente da country=ABC , verranno esaminati solo i contenuti di un country=ABC directory country=ABC . Ciò può migliorare notevolmente le prestazioni delle query, ma solo se lo schema di partizionamento riflette il filtro comune. La funzionalità di partizionamento è molto utile in Hive, tuttavia, un progetto che crea troppe partizioni può ottimizzare alcune query, ma può essere dannoso per altre query importanti. Altro svantaggio è avere troppe partizioni è il gran numero di file e directory Hadoop che vengono creati inutilmente e in eccesso a NameNode poiché deve conservare tutti i metadati per il file system in memoria.

Bucketing è un’altra tecnica per la decomposizione di set di dati in parti più gestibili. Ad esempio, supponiamo che una tabella utilizzi la date come partizione di primo livello e employee_id come la partizione di secondo livello porta a troppe piccole partizioni. Invece, se si esegue il bucket della tabella dei dipendenti e si utilizza employee_id come colonna di bucketing, il valore di questa colonna verrà sostituito con un numero definito dall’utente in bucket. I record con lo stesso employee_id saranno sempre memorizzati nello stesso bucket. Supponendo che il numero di employee_id sia molto maggiore del numero di bucket, ciascun bucket avrà molti employee_id . Durante la creazione della tabella è ansible specificare come CLUSTERED BY (employee_id) INTO XX BUCKETS; dove XX è il numero di secchi. Bucketing ha diversi vantaggi. Il numero di bucket è fisso in modo che non fluttui con i dati. Se due tables sono occupate da employee_id , Hive può creare un campionamento logicamente corretto. Il benketing aiuta anche a rendere efficaci i join della mappa ecc.

Ci sono alcuni dettagli mancanti nelle spiegazioni precedenti. Per comprendere meglio il funzionamento del partizionamento e del bucket, è necessario esaminare il modo in cui i dati vengono archiviati nell’hive. Diciamo che hai un tavolo

 CREATE TABLE mytable ( name string, city string, employee_id int ) PARTITIONED BY (year STRING, month STRING, day STRING) CLUSTERED BY (employee_id) INTO 256 BUCKETS 

allora l’hive memorizzerà i dati in una gerarchia di directory come

 /user/hive/warehouse/mytable/y=2015/m=12/d=02 

Quindi, devi fare attenzione quando esegui il partizionamento, perché se per esempio partizione di employee_id e hai milioni di dipendenti, finirai per avere milioni di directory nel tuo file system. Il termine ” cardinalità ” si riferisce al numero di valori possibili che un campo può avere. Ad esempio, se si dispone di un campo “Paese”, i paesi del mondo sono circa 300, quindi la cardinalità sarebbe ~ 300. Per un campo come “timestamp_ms”, che cambia ogni millisecondo, la cardinalità può essere di miliardi. In generale, quando si sceglie un campo per il partizionamento, non dovrebbe avere un’elevata cardinalità, perché finirai con troppe directory nel tuo file system.

Il clustering aka bucketing, d’altra parte, si tradurrà in un numero fisso di file, poiché si specifica il numero di bucket. Quello che l’hive farà è prendere il campo, calcolare un hash e assegnare un record a quel secchio. Ma cosa succede se si utilizza diciamo 256 bucket e il campo su cui si sta eseguendo l’archiviazione ha una cardinalità bassa (ad esempio, è uno stato USA, quindi può essere solo 50 valori diversi)? Avrai 50 bucket con dati e 206 bucket senza dati.

Qualcuno ha già detto in che modo le partizioni possono ridurre drasticamente la quantità di dati che stai interrogando. Quindi, nella mia tabella di esempio, se si desidera eseguire una query solo da una certa data, il partizionamento per anno / mese / giorno ridurrà drasticamente la quantità di IO. Penso che qualcuno abbia menzionato anche come il bucketing può accelerare i join con altre tabelle che hanno esattamente lo stesso bucketing , quindi nel mio esempio, se si stanno unendo due tabelle sullo stesso employee_id, l’hive può fare il bucket join per bucket (ancora meglio se sono già ordinate per employee_id dato che sta per mergesort parti che sono già ordinate, che funziona in tempo lineare aka O (n)).

Quindi, il bucketing funziona bene quando il campo ha un’elevata cardinalità e i dati sono equamente distribuiti tra i bucket. Il partizionamento funziona meglio quando la cardinalità del campo di partizionamento non è troppo alta.

Inoltre, è ansible partizionare su più campi , con un ordine (anno / mese / giorno è un buon esempio), mentre è ansible eseguire il bucket su un solo campo .

Penso di essere in ritardo nel rispondere a questa domanda, ma continua a venire nel mio feed.

Navneet ha fornito una risposta eccellente. Aggiungendovi visivamente.

Il partizionamento aiuta nell’eliminazione dei dati, se usato nella clausola WHERE, dove il bucket aiuta a organizzare i dati in ogni partizione in più file, così come lo stesso set di dati è sempre scritto nello stesso bucket. Aiuta molto nell’unire le colonne.

Supponiamo che tu abbia una tabella con cinque colonne, nome, data_server, some_col3, some_col4 e some_col5. Supponi di aver partizionato la tabella su server_date e aver eseguito il bucket sulla colonna del nome in 10 bucket, la struttura del tuo file sarà simile a quella in basso.

  1. server_date = xyz
    • 00000_0
    • 00001_0
    • 00002_0
    • ……..
    • 00010_0

Qui server_date = xyz è la partizione e 000 file sono i bucket in ogni partizione. I bucket sono calcolati in base ad alcune funzioni hash, quindi le righe con nome = Sandy andranno sempre nello stesso bucket.

Partizionamento dell’hive:

La partizione divide grandi quantità di dati in più sezioni in base al valore di una / e colonna / e della tabella.

Supponiamo che tu stia memorizzando informazioni di persone in tutto il mondo sparse in oltre 196 paesi che si estendono per circa 500 milioni di voci. Se si desidera interrogare persone di un particolare paese (Città del Vaticano), in assenza di partizionamento, è necessario eseguire la scansione di tutti i 500 crore di voci anche per recuperare migliaia di voci di un paese. Se si partiziona la tabella in base al Paese, è ansible perfezionare il processo di query semplicemente controllando i dati per una sola partizione del paese. La partizione Hive crea una directory separata per il valore di una colonna.

Professionisti:

  1. Distribuisci il carico di esecuzione in orizzontale
  2. Esecuzione più veloce delle query in caso di partizione con basso volume di dati. Ad esempio, ottenere la popolazione da ” Città del Vaticano ” ritorna molto veloce invece di cercare l’intera popolazione del mondo.

Contro:

  1. Possibilità di troppe creazioni di piccole partizioni: troppe directory.
  2. Efficace per i dati a basso volume per una determinata partizione. Ma alcune query come group by su un volume elevato di dati richiedono ancora molto tempo per essere eseguite. Ad esempio, il raggruppamento della popolazione della Cina richiederà molto tempo rispetto al raggruppamento della popolazione nella Città del Vaticano. La partizione non risolve il problema di responsività in caso di inclinazione dei dati verso un particolare valore di partizione.

Alveare Bucketing:

Bucketing decompone i dati in parti più gestibili o uguali.

Con il partizionamento, esiste la possibilità di creare più piccole partizioni in base ai valori delle colonne. Se si utilizza il bucketing, si limita il numero di bucket per memorizzare i dati. Questo numero è definito durante gli script di creazione della tabella.

Professionisti

  1. A causa di volumi di dati uguali in ogni partizione, i join sul lato Mappa saranno più veloci.
  2. Risposta alle query più rapida come il partizionamento

Contro

  1. È ansible definire il numero di bucket durante la creazione della tabella, ma il caricamento di un uguale volume di dati deve essere eseguito manualmente dai programmatori.

La differenza è il bucketing divide i file per Nome colonna, e il partizionamento divide i file sotto Per un particolare valore all’interno della tabella

Spero di averlo definito correttamente