Hive nézet és indexelés: Létrehozás példákkal

⚡ Okos összefoglaló

A Hive nézetek mentett lekérdezések, amelyek írásvédett táblákként viselkednek, míg az indexek egy oszlopra mutató mutatók, amelyek felgyorsítják a kereséseket, és mindkettőt az itt látható rövid HiveQL utasításokkal hozzuk létre.

  • 👁️ A nézet logikus: Egy nézet csak a SELECT utasítását tárolja a metaadattárban, így nem foglal el saját lemezterületet.
  • 🔒 Csak olvasható kialakítás: Egy nézet nem lehet a LOAD, INSERT vagy ALTER parancs célja, mivel a Hive minden lekérdezéskor frissen kiértékeli.
  • 📍 Indexpontok az adatoknál: Az index egy oszlopértékre mutató mutató, amely lehetővé teszi a Hive számára, hogy a teljes tábla helyett a fájl egy részét olvassa be.
  • 🗂️ Két kezelő: A kompakt indexelés a nagy elemszámú oszlopokhoz, míg a bitképes indexelés a kevés különálló értékkel rendelkező oszlopokhoz illik.
  • 🔄 Manuális újratelepítés: Egy index soha nem frissül automatikusan, ezért az ALTER INDEX REBUILD parancsnak az alaptábla változásai után kell lefutnia.
  • ???? Eltávolítva a Hive 3.0-ban: Az indexelést a HIVE-18448 alatt elhagytuk, és helyét materializált nézetek, ORC vagy Parquet tárolás és particionálás vette át.

Nézetek és indexek a Hive-ban példákkal elmagyarázva

Mi az a nézet?

A nézetek hasonlóak a táblázatokhoz, és a követelmények alapján generálódnak. A nézet egy tisztán logikai objektum, amely nem rendelkezik saját tárolóhellyel: a Hive csak a lekérdezési szöveget tárolja a metaadattárban, és minden alkalommal kiértékeli, amikor a nézetre hivatkoznak.

  • Bármilyen eredményhalmaz adatot elmenthetünk nézetként a Hive-ban
  • A használat hasonló a következő nézetekhez: SQL
  • Egy nézet csak olvasható, így nem lehet célpontja egy LOAD, INSERT vagy ALTER utasításnak, amely adatokat ír.

Nézet létrehozása:

Syntax:

Create VIEW <VIEWNAME> AS SELECT

A teljes dokumentált űrlap elfogad egy IF NOT EXISTS záradékot és egy opcionális oszloplistát is, ami akkor hasznos, ha a SELECT lista kifejezéseket tartalmaz egyszerű oszlopnevek helyett.

Példa:

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

Ebben a példában a Sample_View nézetet hozzuk létre, amely az összes olyan sorértéket megjeleníti, amelyben a fizetés mező értéke nagyobb, mint 25000. A szűrő a nézeten belül található, így minden olyan lekérdezés, amely a Sample_View nézetből választ, csak ezeket a sorokat látja.

Mi az Index?

Az indexek egy táblázat adott oszlopnevére mutató mutatók. Az index célja a keresési sebesség javítása: index nélkül egy olyan predikátummal rendelkező lekérdezés, mint például WHERE tab1.col1 = 10 betölti a teljes táblát vagy partíciót, és feldolgozza az összes sort, míg a col1 indexe lehetővé teszi, hogy a Hive csak a fájl egy részét olvassa be.

  • A felhasználónak kézzel kell meghatároznia az indexet
  • Bárhol is indexet hozunk létre, az azt jelenti, hogy egy mutatót hozunk létre a tábla egy adott oszlopnevére.
  • A táblázatban lévő oszlopon végrehajtott módosítások az oszlopnévhez létrehozott indexérték használatával kerülnek tárolásra.

Ez a gyorsítás nem ingyenes. Az index felépítése extra feldolgozási költségekkel jár, és maga az index lemezterületet foglal, amelyet a tábla mellett kell karbantartani.

Syntax:

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

Példa:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

Itt egy indexet hozunk létre a guruhive_internaltable táblában az id oszlopnévhez. Fontos megjegyezni, hogy egy olyan kiadáson futó teljes utasításhoz, amely továbbra is támogatja az indexelést, egy indexkezelő záradékra is szükség van, amelyet a következő szakasz teljes egészében bemutat.

Különbség a nézet és az index között a kaptárban

A nézeteket és az indexeket gyakran együtt vezetik be, mivel mindkettő egy meglévő tábla tetején található, de különböző problémákat oldanak meg. A nézet megváltoztatja, hogy mit lát a lekérdezés, míg az index azt, hogy a Hive milyen gyorsan találja meg azt. Az alábbi táblázat összehasonlítja őket.

Aspect Kilátás index
Mit tárol Csak a SELECT utasítás a metaadattárban Egy külön indextábla, amely az adatokra mutató mutatókat tartalmaz
Cél Lekérdezés visszaadott értékének egyszerűsítése vagy korlátozása Csökkentse a predikátumhoz beolvasott adatok mennyiségét
Lemezköltség Egyik sem Extra tárhely, valamint adatváltozás utáni újjáépítés
Írási hozzáférés Csak olvasható Nincs közvetlenül lekérdezve; az optimalizáló ezt használja.
Jelenlegi állapot Teljes mértékben támogatott Eltávolítva a Hive 3.0-ban

A gyakorlatban egy nézetet hoznak létre az olvashatóság és a hozzáférés-vezérlés érdekében, és egy indexet pusztán a szelektív oszlop teljesítménye érdekében.

Indextípusok a Hive-ban szintaxissal

A Hive 2.x-ig terjedő kiadásokban két indexkezelő volt, és a kezelő neve a kötelező AS záradékban szerepel. A kompakt indexelés a Hive 0.7.0-ban, a bitképes indexelés pedig a Hive 0.8.0-ban jelent meg.

  • Kompakt index: az értéket a tároló HDFS blokk címével együtt tárolja, ahelyett, hogy minden egyes előfordulás helyét rögzítené. Sok különböző értékű oszlopokhoz illik.
  • Bitkép index: egyedi értékenként tárol egy bitképet, ami a szokásos megközelítés egy olyan oszlop esetében, amely csak kevés egyedi értéket tartalmaz, például egy állapot- vagy nemjelzőt.

Egy kompakt index létrehozása, listázása és törlése a következőképpen történik:

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

A WITH DEFERRED REBUILD opció feltöltése nélkül regisztrálja az indexet, így a build külön ütemezhető az ALTER INDEX paranccsal. A bitképes index ugyanígy jön létre, csak más kezelőnévvel:

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;

Az index nem frissül automatikusan. Amikor az alaptábla új adatokat kap, az ALTER INDEX … REBUILD parancsot újra kell futtatni, és egy particionált táblán az újraépítés egyetlen partícióra korlátozható.

Miért távolították el az indexelést a Hive 3.0-ban?

Az indexelést a Hive 3.0-s verziójában, a HIVE-18448 alatt eltávolították, így a CREATE INDEX, SHOW INDEX és DROP INDEX funkciók már nem léteznek a jelenlegi klaszteren. A funkció ritkán érte meg az újjáépítési költségét, miután az oszlopos tárolás és a költségalapú optimalizáló kiforrottá vált. Három csere is készült ugyanezzel a témával.

  • Materializált nézetek: A Hive 3.0.0-ban bevezetett egy materializált nézet tárolja a lekérdezés előre kiszámított eredményét, és az optimalizáló automatikusan átírja a bejövő lekérdezéseket ennek alapján.
  • Oszlopos fájlformátumok: Az ORC és a Parquet saját könnyűsúlyú indexekkel és min/max statisztikákkal rendelkezik, így az olvasó átugorhat teljes csíkokat, blokkokat vagy fájlokat felhasználó által definiált index nélkül.
  • Válaszfalak és vödrök: particionálás és vödrözés könyvtár- és fájlszinten metszi az adatokat, ami általában sokkal több bemenetet távolít el, mint egy index valaha is.

A Hive 2.x rendszeren az index továbbra is érvényes, de az új munkákat jobban szolgálja a fenti lehetőségek egyike.

GYIK

A DROP VIEW view_name parancs eltávolítja, az ALTER VIEW view_name RENAME TO new_name parancs pedig átnevezi. Mivel a nézet nem tartalmaz adatot, a drop parancsping soha nem érintjük meg az alaptáblát; csak a metaadattár bejegyzés tűnik el.

Egy materializált nézet az előre kiszámított lekérdezési eredményt valós adatként tárolja, így lemezterületet igényel és ÚJRAÉPÍTÉST igényel. Egy normál nézet csak a lekérdezés szövegét tárolja, és minden hivatkozásnál újraszámításra kerül.

Nem. A metaadattár megőrzi a SELECT utasítást és a feloldott oszlopok listáját, semmi mást. Minden hivatkozás újrafuttatja az alapul szolgáló lekérdezést, ezért egy lassú illesztés feletti nézet lassú marad.

A Hive 0.12.0-s és korábbi verzióiban a CREATE INDEX és DROP INDEX utasítások nevei megkülönböztették a kis- és nagybetűket, míg az ALTER INDEX utasításoknál kisbetűket kellett használni. A Hive 0.13.0 verziójában az indexnevek minden utasításnál megkülönböztették a kis- és nagybetűket.

Igen, bármelyik modern klaszteren. A partíciók metszése a vizsgálat megkezdése előtt teljes könyvtárakat távolít el, a vödrök alapú feldolgozás pedig adott fájlokra szűkíti a csatlakozásokat vagy mintákat, ami általában jobb, mint amit egy indextábla képes nyújtani.

A gépi tanulási eszközök profilokat készítenek a lekérdezési naplókról, rangsorolják a predikátum oszlopokat szelektivitás és gyakoriság szerint, és javaslatokat tesznek arra vonatkozóan, hogy hol lenne kifizetődő egy materializált nézet vagy particionálási séma. Minden javaslatot validálnak egy EXPLAIN tervvel szemben, mielőtt alkalmazzák.

Megbízhatóan állít elő CREATE VIEW utasításokat egy rövid megjegyzésből. Ellenőrizd a verzióspecifikus megjegyzéseket, mert továbbra is kibocsátja a CREATE INDEX szintaxist, amelyet a Hive 3.0 vagy újabb fürtök egyenesen elutasítanak.

Az index egy különálló mutatótábla, és a Hive soha nem frissíti azt, amikor az alaptábla megváltozik. Újraépítés nélkül a mutatók elavultak lesznek, így az optimalizáló vagy kihagyja az indexet, vagy elavult találatokat ad vissza.

Foglald össze ezt a bejegyzést a következőképpen: