Hive View og indeksering: Opret med eksempler
⚡ Smart opsummering
Visninger i Hive er gemte forespørgsler, der fungerer som skrivebeskyttede tabeller, mens indekser er pegere til en kolonne, der fremskynder opslag, og begge oprettes med korte HiveQL-sætninger vist her.

Hvad er en visning?
Views ligner tabeller, og de genereres baseret på kravene. En view er et rent logisk objekt uden egen lagring: Hive gemmer kun forespørgselsteksten i metastoren og evaluerer den hver gang viewet refereres.
- Vi kan gemme alle resultatsætdata som en visning i Hive
- Brugen ligner de visninger, der bruges i SQL
- En visning er skrivebeskyttet, så den kan ikke være målet for en LOAD-, INSERT- eller ALTER-sætning, der skriver data.
Oprettelse af visning:
Syntaks:
Create VIEW <VIEWNAME> AS SELECT
Den fuldt dokumenterede formular accepterer også en IF NOT EXISTS-klausul og en valgfri kolonneliste, hvilket er nyttigt, når SELECT-listen indeholder udtryk i stedet for almindelige kolonnenavne.
Eksempel:
Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000
I dette eksempel opretter vi visningen Sample_View, som viser alle rækkeværdier med et lønfelt større end 25000. Filteret findes i visningen, så enhver forespørgsel, der vælger fra Sample_View, ser kun disse rækker.
Hvad er indeks?
Indekser er pegepunkter til et bestemt kolonnenavn i en tabel. Målet med et indeks er at forbedre opslagshastigheden: uden et indeks ville en forespørgsel med et prædikat som f.eks. HVOR tab1.col1 = 10 indlæser hele tabellen eller partitionen og behandler hver række, mens et indeks på col1 kun lader Hive læse en del af filen.
- Brugeren skal manuelt definere indekset
- Uanset hvor vi opretter et indeks, betyder det, at vi opretter en pointer til et bestemt kolonnenavn i tabellen.
- Eventuelle ændringer foretaget i kolonnen i tabellen gemmes ved hjælp af den indeksværdi, der er oprettet på kolonnenavnet.
Den hastighedsforøgelse er ikke gratis. Opbygning af indekset koster ekstra processering, og selve indekset optager diskplads, der skal vedligeholdes ved siden af tabellen.
Syntaks:
Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>
Eksempel:
Create INDEX sample_Index ON TABLE guruhive_internaltable(id)
Her opretter vi et indeks på tabellen guruhive_internaltable for kolonnenavnet id. Bemærk, at en komplet sætning på en udgivelse, der stadig understøtter indeksering, også kræver en index-handler-klausul, hvilket næste afsnit viser fuldt ud.
Forskellen mellem visning og indeks i Hive
Visninger og indekser introduceres ofte sammen, fordi begge sidder oven på en eksisterende tabel, men de løser forskellige problemer. En visning ændrer, hvad en forespørgsel ser, mens et indeks ændrer, hvor hurtigt Hive finder den. Tabellen nedenfor sammenligner dem.
| Aspect | Se | Indeks |
|---|---|---|
| Hvad den gemmer | Kun SELECT-sætningen i metastoren | En separat indekstabel, der indeholder pointere til dataene |
| Formål | Forenkle eller begrænse, hvad en forespørgsel returnerer | Reducer mængden af data, der scannes for et prædikat |
| Diskpris | Ingen | Ekstra lagerplads plus genopbygning efter dataændringer |
| Skriveadgang | Skrivebeskyttet | Ikke forespurgt direkte; optimeringsværktøjet bruger det |
| Nuværende status | Fuldt understøttet | Fjernet i Hive 3.0 |
I praksis oprettes en visning med henblik på læsbarhed og adgangskontrol, og et indeks oprettes udelukkende med henblik på ydeevne på en selektiv kolonne.
Typer af indeks i Hive med syntaks
Udgivelser op til Hive 2.x leverede to indekshandlere, og handleren er navngivet i den obligatoriske AS-klausul. Kompakt indeksering ankom i Hive 0.7.0 og bitmap-indeksering i Hive 0.8.0.
- Kompakt indeks: gemmer værdien sammen med adressen på den HDFS-blok, der indeholder den, i stedet for at registrere placeringen af hver enkelt forekomst. Den passer til kolonner med mange forskellige værdier.
- Bitmap-indeks: gemmer et bitmap pr. distinkt værdi, hvilket er den sædvanlige fremgangsmåde for en kolonne med kun et lille antal distinkte værdier, f.eks. et status- eller kønsflag.
Et kompakt indeks oprettes, vises og slettes som følger:
CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT'; SHOW INDEX ON table01; DROP INDEX table01_index ON table01;
Indstillingen WITH DEFERRED REBUILD registrerer indekset uden at udfylde det, så build'et kan planlægges separat med ALTER INDEX. Et bitmapindeks oprettes på samme måde, med et andet handlernavn:
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;
Et indeks opdateres ikke automatisk. Når basistabellen modtager nye data, skal ALTER INDEX … REBUILD køres igen, og på en partitioneret tabel kan genopbygningen begrænses til en enkelt partition.
Hvorfor indeksering blev fjernet i Hive 3.0
Indeksering blev fjernet fra Hive i version 3.0 under HIVE-18448, så CREATE INDEX, SHOW INDEX og DROP INDEX findes ikke længere på en nuværende klynge. Funktionen var sjældent sine genopbygningsomkostninger værd, når først kolonneformatlagring og den omkostningsbaserede optimering var modnet. Tre udskiftninger dækker det samme område.
- Materialiserede synspunkter: introduceret i Hive 3.0.0, en materialiseret visning gemmer det forudberegnede resultat af en forespørgsel, og optimeringsprogrammet omskriver automatisk indgående forespørgsler i forhold til det.
- Kolonneformede filformater: ORC og Parquet har deres egne letvægtsindekser og min/maks-statistikker, så læseren kan springe hele striber, blokke eller filer over uden et brugerdefineret indeks.
- Skillevægge og spande: partitionering og bucketing beskære data på mappe- og filniveau, hvilket normalt fjerner langt mere input end et indeks nogensinde har gjort.
På Hive 2.x er et indeks stadig gyldigt, men nyt arbejde tjenes bedre med en af ovenstående muligheder.
