Hive View e indicizzazione: creazione con esempi

⚡ Riepilogo intelligente

In Hive, le viste sono query salvate che si comportano come tabelle di sola lettura, mentre gli indici sono puntatori a una colonna che velocizzano le ricerche; entrambi vengono creati con brevi istruzioni HiveQL, come mostrato qui.

  • 👁️ La prospettiva è logica: Una vista memorizza nel metastore solo la sua istruzione SELECT, quindi non occupa spazio su disco proprio.
  • 🔒 Sola lettura per impostazione predefinita: Una vista non può essere la destinazione di LOAD, INSERT o ALTER, perché Hive la valuta ex novo ad ogni query.
  • 📍 L'indice punta ai dati: Un indice è un puntatore al valore di una colonna che consente a Hive di leggere una parte di un file anziché l'intera tabella.
  • 🗂️ Due addetti: L'indicizzazione compatta è adatta a colonne con elevata cardinalità, mentre l'indicizzazione bitmap è adatta a colonne con pochi valori distinti.
  • 🔄 Ricostruzione manuale: Un indice non viene mai aggiornato automaticamente, quindi è necessario eseguire ALTER INDEX REBUILD dopo ogni modifica alla tabella di base.
  • 🚫 Rimosso in Hive 3.0: L'indicizzazione è stata abbandonata con HIVE-18448 e sostituita da viste materializzate, archiviazione ORC o Parquet e partizionamento.

Viste e indici in Hive spiegati con esempi

Cos'è una vista?

Le viste sono simili alle tabelle e vengono generate in base ai requisiti. Una vista è un oggetto puramente logico senza una propria memoria di archiviazione: Hive conserva nel metastore solo il testo della query e lo valuta ogni volta che si fa riferimento alla vista.

  • Possiamo salvare qualsiasi dato del set di risultati come visualizzazione in Hive
  • L'utilizzo è simile alle viste utilizzate in SQL
  • Una vista è di sola lettura, quindi non può essere la destinazione di un'istruzione LOAD, INSERT o ALTER che scrive dati

Creazione della vista:

Sintassi:

Create VIEW <VIEWNAME> AS SELECT

La versione completa documentata accetta anche una clausola IF NOT EXISTS e un elenco di colonne facoltativo, utile quando l'elenco SELECT contiene espressioni anziché semplici nomi di colonna.

Esempio:

Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000

In questo esempio, creiamo la vista Sample_View, che visualizza tutti i valori di riga con un campo stipendio maggiore di 25000. Il filtro si trova all'interno della vista, quindi qualsiasi query che seleziona da Sample_View visualizzerà solo quelle righe.

Cos'è Indice?

Gli indici sono puntatori al nome di una colonna specifica di una tabella. L'obiettivo di un indice è migliorare la velocità di ricerca: senza di esso, una query con un predicato come DOVE tab1.col1 = 10 carica l'intera tabella o partizione ed elabora ogni riga, mentre un indice sulla colonna 1 consente a Hive di leggere solo una parte del file.

  • L'utente deve definire manualmente l'indice
  • Ogni volta che creiamo un indice, significa che stiamo creando un puntatore al nome di una colonna specifica della tabella.
  • Qualsiasi modifica apportata alla colonna presente nella tabella viene memorizzata utilizzando il valore dell'indice creato sul nome della colonna.

Questo incremento di velocità non è gratuito. La creazione dell'indice richiede un'elaborazione aggiuntiva e l'indice stesso occupa spazio su disco che deve essere gestito insieme alla tabella.

Sintassi:

Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>

Esempio:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

Qui stiamo creando un indice sulla tabella guruhive_internaltable per la colonna denominata id. Si noti che un'istruzione completa su una release che supporta ancora l'indicizzazione richiede anche una clausola index-handler, che viene mostrata per intero nella sezione successiva.

Differenza tra View e Index in Hive

Viste e indici vengono spesso presentati insieme perché entrambi si basano su una tabella esistente, ma risolvono problemi diversi. Una vista modifica ciò che una query visualizza, mentre un indice modifica la velocità con cui Hive la trova. La tabella seguente li confronta.

Aspetto Visualizzare Indice
Cosa memorizza Solo l'istruzione SELECT, nel metastore Una tabella indice separata contenente puntatori ai dati
Missione Semplifica o limita i risultati di una query Ridurre la quantità di dati analizzati per un predicato
Costo del disco Nona Spazio di archiviazione aggiuntivo più ricostruzione dopo le modifiche ai dati
Accesso in scrittura Sola lettura Non viene interrogato direttamente; l'ottimizzatore lo utilizza
Stato attuale Completamente supportato Rimosso in Hive 3.0

In pratica, una vista viene creata per la leggibilità e il controllo degli accessi, mentre un indice viene creato esclusivamente per ottimizzare le prestazioni su una colonna specifica.

Tipi di indice in Hive con sintassi

Fino alla versione 2.x di Hive, erano disponibili due gestori di indicizzazione, il cui nome è specificato nella clausola AS obbligatoria. L'indicizzazione compatta è stata introdotta in Hive 0.7.0, mentre l'indicizzazione bitmap è stata introdotta in Hive 0.8.0.

  • Indice compatto: Memorizza il valore insieme all'indirizzo del blocco HDFS che lo contiene, invece di registrare la posizione di ogni singola occorrenza. È adatto a colonne con molti valori distinti.
  • Indice della bitmap: memorizza una bitmap per ogni valore distinto, che è l'approccio usuale per una colonna con solo un piccolo numero di valori distinti, come un flag di stato o di genere.

Un indice compatto viene creato, elencato ed eliminato come segue:

CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;

L'opzione WITH DEFERRED REBUILD registra l'indice senza popolarlo, in modo che la compilazione possa essere pianificata separatamente con ALTER INDEX. Un indice bitmap viene creato allo stesso modo, con un nome di gestore diverso:

CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD;
ALTER INDEX table03_index ON table03 REBUILD;
SHOW FORMATTED INDEX ON table03;
DROP INDEX table03_index ON table03;

Un indice non viene aggiornato automaticamente. Ogni volta che la tabella di base riceve nuovi dati, è necessario eseguire nuovamente il comando ALTER INDEX … REBUILD e, nel caso di una tabella partizionata, la ricostruzione può essere limitata a una singola partizione.

Perché l'indicizzazione è stata rimossa in Hive 3.0

La funzionalità di indicizzazione è stata rimossa da Hive nella versione 3.0 con il bug HIVE-18448, pertanto i comandi CREATE INDEX, SHOW INDEX e DROP INDEX non sono più presenti nei cluster attuali. La funzionalità raramente giustificava i costi di ricostruzione una volta che l'archiviazione a colonne e l'ottimizzatore basato sui costi si sono consolidati. Tre alternative svolgono la stessa funzione.

  • Viste materializzate: introdotto in Hive 3.0.0, un vista materializzata memorizza il risultato precalcolato di una query e l'ottimizzatore riscrive automaticamente le query in arrivo utilizzandolo come riferimento.
  • Formati di file a colonne: ORC e ​​Parquet dispongono di indici leggeri e statistiche min/max integrate, consentendo al lettore di saltare intere righe, blocchi o file senza bisogno di un indice definito dall'utente.
  • Divisori e secchi: partizionamento e bucketing Elimina i dati a livello di directory e di file, operazione che in genere rimuove molti più dati di quanti ne potesse mai fare un indice.

Su Hive 2.x un indice è ancora valido, ma per i nuovi progetti è preferibile utilizzare una delle opzioni sopra indicate.

DOMANDE FREQUENTI

DROP VIEW view_name la rimuove e ALTER VIEW view_name RENAME TO new_name la rinomina. Poiché una vista non contiene dati, dropping Non si tocca mai la tabella di base; scompare solo la voce del metastore.

Una vista materializzata memorizza il risultato della query precalcolata come dati reali, quindi occupa spazio su disco e richiede una ricostruzione (REBUILD). Una vista normale memorizza solo il testo della query e viene ricalcolata a ogni riferimento.

No. Il metastore conserva l'istruzione SELECT e l'elenco delle colonne risolte, nient'altro. Ogni riferimento riesegue la query sottostante, ed è per questo che una vista su un join lento rimane lenta.

Nelle versioni di Hive 0.12.0 e precedenti, il nome dell'indice era sensibile alle maiuscole/minuscole per le istruzioni CREATE INDEX e DROP INDEX, mentre ALTER INDEX richiedeva il minuscolo. Hive 0.13.0 ha reso i nomi degli indici non sensibili alle maiuscole/minuscole per tutte le istruzioni.

Sì, su qualsiasi cluster moderno. La pulizia delle partizioni rimuove intere directory prima dell'inizio della scansione e il bucketing restringe un'unione o un campione a file specifici, il che di solito è più efficace di quanto potrebbe offrire una tabella di indice.

Gli strumenti di machine learning analizzano i log delle query, classificano le colonne dei predicati in base alla selettività e alla frequenza e suggeriscono dove una vista materializzata o uno schema di partizionamento potrebbero risultare vantaggiosi. Convalida ogni suggerimento rispetto a un piano EXPLAIN prima di applicarlo.

Genera in modo affidabile istruzioni CREATE VIEW a partire da un breve commento. Verifica eventuali specificità di versione, poiché genera ancora una sintassi CREATE INDEX che un cluster Hive 3.0 o versioni successive rifiuta categoricamente.

L'indice è una tabella di puntatori separata e Hive non lo aggiorna mai quando la tabella di base cambia. Senza una ricostruzione, i puntatori diventano obsoleti, quindi l'ottimizzatore o salta l'indice o restituisce corrispondenze non aggiornate.

Riassumi questo post con: