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.

  • 👁️ Synspunktet er logisk: En visning gemmer kun sin SELECT-sætning i metastoret, så den optager ikke sin egen diskplads.
  • 🔒 Skrivebeskyttet efter design: En visning kan ikke være målet for LOAD, INSERT eller ALTER, fordi Hive evaluerer den forfra på hver forespørgsel.
  • 📍 Indekspunkter på data: Et indeks er en pointer til en kolonneværdi, der lader Hive læse en del af en fil i stedet for hele tabellen.
  • 🗂️ To håndværkere: Kompakt indeksering passer til kolonner med høj kardinalitet, og bitmap-indeksering passer til kolonner med få forskellige værdier.
  • 🔄 Manuel genopbygning: Et indeks opdateres aldrig automatisk, så ALTER INDEX REBUILD skal køres, efter basistabellen ændres.
  • 🚫 Fjernet i Hive 3.0: Indeksering blev droppet under HIVE-18448, og materialiserede visninger, ORC eller Parquet-lagring og -partitionering erstatter det.

Visninger og indekser i Hive forklaret med eksempler

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.

Ofte Stillede Spørgsmål

DROP VIEW view_name fjerner det, og ALTER VIEW view_name RENAME TO new_name omdøber det. Fordi et view ikke indeholder data, dropping man rører aldrig basistabellen; kun metastore-posten forsvinder.

En materialiseret visning gemmer det præberegnede forespørgselsresultat som reelle data, så det koster diskplads og kræver en GENOPBYGNING. En normal visning gemmer kun forespørgselsteksten og genberegnes ved hver reference.

Nej. Metastoren beholder SELECT-sætningen og den løste kolonneliste, intet mere. Hver reference kører den underliggende forespørgsel igen, hvilket er grunden til, at en visning over en langsom join forbliver langsom.

I Hive 0.12.0 og tidligere var navnet forskelsfølsomt for CREATE INDEX og DROP INDEX, mens ALTER INDEX krævede små bogstaver. Hive 0.13.0 gjorde indeksnavne ufølsomme over for store og små bogstaver for alle sætninger.

Ja, på alle moderne klynger. Partitionsbeskæring fjerner hele mapper, før scanningen starter, og bucketing indsnævrer et join eller sample til specifikke filer, hvilket normalt overgår, hvad en indekstabel kunne levere.

Maskinlæringsværktøjer profilerer forespørgselslogfiler, rangerer prædikatkolonner efter selektivitet og hyppighed og foreslår, hvor en materialiseret visning eller et partitionsskema ville betale sig. Valider hvert forslag mod en EXPLAIN-plan, før det anvendes.

Den producerer CREATE VIEW-sætninger pålideligt fra en kort kommentar. Tjek alt versionsspecifikt, da den stadig udsender CREATE INDEX-syntaks, som en Hive 3.0 eller nyere klynge afviser direkte.

Indekset er en separat tabel med pointere, og Hive opdaterer den aldrig, når basistabellen ændres. Uden en genopbygning bliver pointerne forældede, så optimeringsværktøjet enten springer indekset over eller returnerer forældede matches.

Opsummer dette indlæg med: