Hive View och indexering: Skapa med exempel

⚡ Smart sammanfattning

Vyer i Hive är sparade frågor som beter sig som skrivskyddade tabeller, medan index är pekare till en kolumn som snabbar upp sökningar, och båda skapas med korta HiveQL-satser som visas här.

  • 👁️ Vyn är logisk: En vy lagrar bara sin SELECT-sats i metaarkivet, så den upptar inget eget diskutrymme.
  • 🔒 Skrivskyddad enligt design: En vy kan inte vara mål för LOAD, INSERT eller ALTER, eftersom Hive utvärderar den på nytt vid varje fråga.
  • 📍 Indexpunkter vid data: Ett index är en pekare till ett kolumnvärde som låter Hive läsa en del av en fil istället för hela tabellen.
  • 🗂️ Två handläggare: Kompakt indexering passar kolumner med hög kardinalitet och bitmappsindexering passar kolumner med få distinkta värden.
  • 🔄 Manuell ombyggnad: Ett index uppdateras aldrig automatiskt, så ALTER INDEX REBUILD måste köras efter att bastabellen ändras.
  • ???? Borttaget i Hive 3.0: Indexering togs bort under HIVE-18448, och materialiserade vyer, ORC- eller Parquet-lagring och partitionering ersatte den.

Vyer och index i Hive förklarade med exempel

Vad är en vy?

Vyer liknar tabeller och genereras baserat på kraven. En vy är ett rent logiskt objekt utan egen lagring: Hive lagrar endast frågetexten i metaarkivet och utvärderar den varje gång vyn refereras.

  • Vi kan spara alla resultatuppsättningsdata som en vy i Hive
  • Användningen liknar de vyer som används i SQL
  • En vy är skrivskyddad, så den kan inte vara mål för en LOAD-, INSERT- eller ALTER-sats som skriver data.

Skapande av vy:

Syntax:

Create VIEW <VIEWNAME> AS SELECT

Det fullständiga dokumenterade formuläret accepterar även en IF NOT EXISTS-klausul och en valfri kolumnlista, vilket är användbart när SELECT-listan innehåller uttryck snarare än vanliga kolumnnamn.

Exempel:

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

I det här exemplet skapar vi vyn Sample_View, som visar alla radvärden med ett lönefält större än 25000. Filtret finns inuti vyn, så alla frågor som väljer från Sample_View ser bara dessa rader.

Vad är Index?

Index är pekare till ett visst kolumnnamn i en tabell. Målet med ett index är att förbättra sökhastigheten: utan ett sådant index kan en fråga med ett predikat som DÄR tab1.col1 = 10 laddar hela tabellen eller partitionen och bearbetar varje rad, medan ett index på col1 låter Hive bara läsa en del av filen.

  • Användaren måste manuellt definiera indexet
  • Var vi än skapar ett index betyder det att vi skapar en pekare till ett visst kolumnnamn i tabellen.
  • Alla ändringar som görs i kolumnen i tabellen lagras med hjälp av indexvärdet som skapats för kolumnnamnet.

Den snabbheten är inte gratis. Att bygga indexet kostar extra bearbetning, och själva indexet upptar diskutrymme som måste underhållas bredvid tabellen.

Syntax:

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

Exempel:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

Här skapar vi ett index i tabellen guruhive_internaltable för kolumnnamnet id. Observera att en komplett sats i en utgåva som fortfarande stöder indexering också behöver en index-handler-klausul, vilket nästa avsnitt visar i sin helhet.

Skillnaden mellan vy och index i Hive

Vyer och index introduceras ofta tillsammans eftersom båda finns ovanpå en befintlig tabell, men de löser olika problem. En vy ändrar vad en fråga ser, medan ett index ändrar hur snabbt Hive hittar den. Tabellen nedan jämför dem.

Aspect Visa index
Vad den lagrar Endast SELECT-satsen i metaarkivet En separat indextabell som innehåller pekare till data
Syfte Förenkla eller begränsa vad en fråga returnerar Minska mängden data som skannas för ett predikat
Diskkostnad Ingen Extra lagring plus en ombyggnad efter dataändringar
Skrivåtkomst Skrivskyddad Inte direkt efterfrågad; optimeraren använder den
Nuvarande status Fullt stöd Borttagen i Hive 3.0

I praktiken skapas en vy för läsbarhet och åtkomstkontroll, och ett index skapades enbart för prestanda på en selektiv kolumn.

Typer av index i Hive med syntax

Versioner upp till Hive 2.x levererade två indexhanterare, och hanteraren namnges i den obligatoriska AS-klausulen. Kompakt indexering kom i Hive 0.7.0 och bitmappsindexering i Hive 0.8.0.

  • Kompakt index: lagrar värdet tillsammans med adressen till HDFS-blocket som innehåller det, istället för att registrera platsen för varje enskild förekomst. Det passar kolumner med många distinkta värden.
  • Bitmappsindex: lagrar en bitmapp per distinkt värde, vilket är den vanliga metoden för en kolumn med endast ett litet antal distinkta värden, till exempel en status- eller könsflagga.

Ett kompakt index skapas, listas och tas bort enligt följande:

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

Alternativet WITH DEFERRED REBUILD registrerar indexet utan att fylla i det, så att bygget kan schemaläggas separat med ALTER INDEX. Ett bitmappsindex skapas på samma sätt, med ett annat hanterarnamn:

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;

Ett index uppdateras inte automatiskt. När bastabellen tar emot nya data måste ALTER INDEX … REBUILD köras igen, och på en partitionerad tabell kan återuppbyggnaden begränsas till en enda partition.

Varför indexering togs bort i Hive 3.0

Indexering togs bort från Hive i version 3.0 under HIVE-18448, så CREATE INDEX, SHOW INDEX och DROP INDEX finns inte längre i ett befintligt kluster. Funktionen var sällan värd sin ombyggnadskostnad när kolumnlagring och den kostnadsbaserade optimeraren väl hade mognat. Tre ersättningar täcker samma område.

  • Materialiserade vyer: introducerad i Hive 3.0.0, en materialiserad vy lagrar det förberäknade resultatet av en fråga och optimeraren skriver om inkommande frågor mot det automatiskt.
  • Kolumnära filformat: ORC och Parquet har sina egna lättviktsindex och min/max-statistik, så läsaren kan hoppa över hela ränder, block eller filer utan något användardefinierat index.
  • Skiljeväggar och hinkar: partitionering och bucketing rensa data på katalog- och filnivå, vilket vanligtvis tar bort mycket mer indata än ett index någonsin gjorde.

På Hive 2.x är ett index fortfarande giltigt, men nytt arbete tjänas bättre på att använda ett av alternativen ovan.

Vanliga frågor

DROP VIEW view_name tar bort den, och ALTER VIEW view_name RENAME TO new_name byter namn på den. Eftersom en vy inte innehåller några data, släppping man rör aldrig vid bastabellen; bara metaarkivposten försvinner.

En materialiserad vy lagrar det förberäknade frågeresultatet som verkliga data, så det kostar diskutrymme och behöver en ombyggnad. En normal vy lagrar endast frågetexten och beräknas om vid varje referens.

Nej. Metaarkivet behåller SELECT-satsen och den lösta kolumnlistan, inget mer. Varje referens kör den underliggande frågan igen, vilket är anledningen till att en vy över en långsam koppling förblir långsam.

I Hive 0.12.0 och tidigare var namnet skiftlägeskänsligt för CREATE INDEX och DROP INDEX, medan ALTER INDEX behövde gemener. Hive 0.13.0 gjorde indexnamn skiftlägeskänsliga för alla uttryck.

Ja, på alla moderna kluster. Partitionsrensning tar bort hela kataloger innan skanningen startar och bucketing begränsar en join eller sampling till specifika filer, vilket vanligtvis överträffar vad en indextabell skulle kunna leverera.

Maskininlärningsverktyg profilerar frågeloggar, rangordnar predikatkolumner efter selektivitet och frekvens och föreslår var en materialiserad vy eller ett partitionsschema skulle löna sig. Validera varje förslag mot en EXPLAIN-plan innan du tillämpar det.

Den producerar CREATE VIEW-satser på ett tillförlitligt sätt från en kort kommentar. Kontrollera allt versionsspecifikt, eftersom den fortfarande genererar CREATE INDEX-syntax som ett Hive 3.0- eller senare kluster avvisar direkt.

Indexet är en separat tabell med pekare, och Hive uppdaterar den aldrig när bastabellen ändras. Utan en ombyggnad blir pekarna inaktuella, så optimeraren hoppar antingen över indexet eller returnerar föråldrade matchningar.

Sammanfatta detta inlägg med: