Hive-weergave en indexering: Aan de hand van voorbeelden

⚡ Slimme samenvatting

Views in Hive zijn opgeslagen query's die zich gedragen als alleen-lezen tabellen, terwijl indexen verwijzingen zijn naar een kolom die zoekopdrachten versnellen. Beide worden gemaakt met korte HiveQL-instructies, zoals hieronder weergegeven.

  • 👁️ De zienswijze is logisch: Een view slaat alleen de SELECT-instructie op in de metastore en neemt daarom geen eigen schijfruimte in beslag.
  • 🔒 Alleen-lezen in ontwerp: Een view kan niet het doelwit zijn van LOAD, INSERT of ALTER, omdat Hive deze bij elke query opnieuw evalueert.
  • 📍 Indexpunten bij gegevens: Een index is een verwijzing naar een kolomwaarde waarmee Hive een deel van een bestand kan lezen in plaats van de hele tabel.
  • 🗂️ Twee begeleiders: Compacte indexering is geschikt voor kolommen met een hoge cardinaliteit, terwijl bitmapindexering geschikt is voor kolommen met weinig unieke waarden.
  • 🔄 Handmatige herbouw: Een index wordt nooit automatisch vernieuwd, dus ALTER INDEX REBUILD moet worden uitgevoerd nadat de basistabel is gewijzigd.
  • ???? Verwijderd in Hive 3.0: Indexering werd afgeschaft onder HIVE-18448 en vervangen door gematerialiseerde weergaven, ORC- of Parquet-opslag en partitionering.

Views en indexen in Hive uitgelegd aan de hand van voorbeelden.

Wat is een weergave?

Views lijken op tabellen en worden gegenereerd op basis van de vereisten. Een view is een puur logisch object zonder eigen opslag: Hive bewaart alleen de querytekst in de metastore en evalueert deze telkens wanneer de view wordt aangeroepen.

  • We kunnen alle resultaatsetgegevens opslaan als weergave in Hive
  • Het gebruik is vergelijkbaar met de weergaven die worden gebruikt in SQL
  • Een view is alleen-lezen, dus deze kan niet het doelwit zijn van een LOAD-, INSERT- of ALTER-instructie die gegevens schrijft.

Weergave creëren:

Syntax:

Create VIEW <VIEWNAME> AS SELECT

De volledig gedocumenteerde vorm accepteert ook een IF NOT EXISTS-clausule en een optionele kolomlijst, wat handig is wanneer de SELECT-lijst expressies bevat in plaats van gewone kolomnamen.

Voorbeeld:

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

In dit voorbeeld maken we de weergave Sample_View aan, die alle rijwaarden weergeeft met een salarisveld groter dan 25000. Het filter bevindt zich in de weergave, dus elke query die selecteert uit Sample_View ziet alleen die rijen.

Wat is indexeren?

Indexen zijn verwijzingen naar een specifieke kolomnaam in een tabel. Het doel van een index is het verbeteren van de zoeksnelheid: zonder index zou een query met een predicaat zoals WAAR tab1.col1 = 10 Een index op kolom 1 laadt de hele tabel of partitie en verwerkt elke rij, terwijl een index op kolom 1 Hive slechts een deel van het bestand laat lezen.

  • De gebruiker moet de index handmatig definiëren
  • Wanneer we een index aanmaken, betekent dit dat we een verwijzing maken naar een specifieke kolomnaam in de tabel.
  • Alle wijzigingen die in een kolom in de tabel worden aangebracht, worden opgeslagen met behulp van de indexwaarde die is aangemaakt voor die kolomnaam.

Die snelheidsverbetering is niet gratis. Het opbouwen van de index kost extra verwerkingstijd, en de index zelf neemt schijfruimte in beslag die naast de tabel onderhouden moet worden.

Syntax:

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

Voorbeeld:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

Hier maken we een index aan op de tabel guruhive_internaltable voor de kolomnaam 'id'. Merk op dat een volledige instructie in een release die nog steeds indexering ondersteunt, ook een index-handler-clausule nodig heeft, die in de volgende sectie volledig wordt uitgelegd.

Verschil tussen weergave en index in Hive

Views en indexen worden vaak samen besproken omdat ze beide bovenop een bestaande tabel worden geplaatst, maar ze lossen verschillende problemen op. Een view verandert wat een query ziet, terwijl een index verandert hoe snel Hive de query vindt. De onderstaande tabel vergelijkt ze.

Aspect Bekijk Index
Wat het opslaat Alleen de SELECT-instructie in de metastore. Een aparte indextabel met verwijzingen naar de gegevens.
Doel Vereenvoudig of beperk wat een query retourneert. Verminder de hoeveelheid gegevens die worden gescand voor een predicaat.
Schijfkosten Geen Extra opslagruimte plus een herstel na gegevenswijzigingen
Schrijftoegang Alleen-lezen Niet rechtstreeks opgevraagd; de optimizer gebruikt het.
Huidige status Volledig ondersteund Verwijderd in Hive 3.0

In de praktijk wordt een view gecreëerd voor leesbaarheid en toegangscontrole, terwijl een index puur voor prestatieverbetering op een specifieke kolom wordt aangemaakt.

Indexsoorten in Hive met syntaxis

Versies tot en met Hive 2.x bevatten twee indexhandlers, en de handler wordt genoemd in de verplichte AS-clausule. Compacte indexering werd geïntroduceerd in Hive 0.7.0 en bitmapindexering in Hive 0.8.0.

  • Compacte index: Slaat de waarde samen met het adres van het HDFS-blok waarin deze zich bevindt op, in plaats van de locatie van elke afzonderlijke instantie vast te leggen. Dit is geschikt voor kolommen met veel verschillende waarden.
  • Bitmapindex: Slaat een bitmap op voor elke unieke waarde, wat de gebruikelijke aanpak is voor een kolom met slechts een klein aantal unieke waarden, zoals een status- of geslachtsvlag.

Een compacte index wordt als volgt aangemaakt, weergegeven en verwijderd:

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

De optie WITH DEFERRED REBUILD registreert de index zonder deze te vullen, zodat de build afzonderlijk kan worden gepland met ALTER INDEX. Een bitmapindex wordt op dezelfde manier aangemaakt, maar met een andere handlernaam:

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;

Een index wordt niet automatisch vernieuwd. Telkens wanneer de basistabel nieuwe gegevens ontvangt, moet ALTER INDEX … REBUILD opnieuw worden uitgevoerd. Bij een gepartitioneerde tabel kan de vernieuwing beperkt blijven tot één enkele partitie.

Waarom indexering is verwijderd in Hive 3.0

Indexering is in versie 3.0 van Hive verwijderd onder HIVE-18448, waardoor CREATE INDEX, SHOW INDEX en DROP INDEX niet meer bestaan ​​op een actueel cluster. De functie was de heropbouwkosten zelden meer waard toen kolomopslag en de op kosten gebaseerde optimizer volwassen waren geworden. Drie vervangende functies dekken dezelfde functionaliteit.

  • Gerealiseerde weergaven: geïntroduceerd in Hive 3.0.0, een gematerialiseerde weergave Het slaat het vooraf berekende resultaat van een query op, waarna de optimizer inkomende query's automatisch herschrijft op basis daarvan.
  • Kolomgeoriënteerde bestandsindelingen: ORC en Parquet hebben hun eigen lichtgewicht indexen en min/max-statistieken, waardoor de lezer hele strips, blokken of bestanden kan overslaan zonder een door de gebruiker gedefinieerde index.
  • Partities en buckets: partitionering en bucketing Het opschonen van gegevens op map- en bestandsniveau verwijdert doorgaans veel meer invoer dan een index ooit deed.

In Hive 2.x is een index nog steeds geldig, maar voor nieuw werk is een van de bovenstaande opties beter te gebruiken.

Veelgestelde vragen

DROP VIEW view_name verwijdert de view, en ALTER VIEW view_name RENAME TO new_name hernoemt de view. Omdat een view geen gegevens bevat, verwijdert DROP VIEW view_name de view.ping De basistabel wordt nooit aangepast; alleen de metastore-vermelding verdwijnt.

Een gematerialiseerde weergave slaat het vooraf berekende queryresultaat op als echte data, waardoor schijfruimte wordt verbruikt en een heropbouw nodig is. Een normale weergave slaat alleen de querytekst op en wordt bij elke verwijzing opnieuw berekend.

Nee. De metastore bewaart de SELECT-instructie en de lijst met opgeloste kolommen, meer niet. Elke verwijzing voert de onderliggende query opnieuw uit, daarom blijft een view over een trage join traag.

In Hive 0.12.0 en eerdere versies was de naam hoofdlettergevoelig voor CREATE INDEX en DROP INDEX, terwijl ALTER INDEX kleine letters vereiste. Hive 0.13.0 heeft ervoor gezorgd dat indexnamen voor alle statements niet hoofdlettergevoelig zijn.

Ja, op elk modern cluster. Partitie-opschoning verwijdert complete mappen voordat de scan begint en bucketing beperkt een join of steekproef tot specifieke bestanden, wat meestal beter is dan wat een indextabel zou kunnen leveren.

Machine learning-tools analyseren querylogs, rangschikken predicaatkolommen op basis van selectiviteit en frequentie, en suggereren waar een gematerialiseerde weergave of partitioneringsschema rendabel zou zijn. Valideer elke suggestie aan de hand van een EXPLAIN-plan voordat u deze toepast.

Het genereert betrouwbaar CREATE VIEW-instructies op basis van een korte opmerking. Controleer alles wat versiespecifiek is, want het genereert nog steeds CREATE INDEX-syntaxis die een Hive 3.0-cluster of later zonder meer afwijst.

De index is een aparte tabel met pointers, en Hive vernieuwt deze nooit wanneer de basistabel verandert. Zonder een heropbouw raken de pointers verouderd, waardoor de optimizer de index overslaat of verouderde overeenkomsten retourneert.

Vat dit bericht samen met: