Hive Join & SubQuery Tutorial ja esimerkkejä

⚡ Älykäs yhteenveto

Hive-liitokset yhdistävät kahden tai useamman taulukon rivit samassa sarakkeessa, ja alikyselyt sijoittavat yhden kyselyn toisen sisään, joten molemmat esitellään tässä kahdella esimerkkitaulukolla, jotka on ladattu pelkkää tekstiä sisältävistä tiedostoista.

  • 🧱 Kaksi esimerkkitaulukkoa: sample_joins sisältää asiakastiedot ja sample_joins1 sisältää tilaustiedot, jotka on yhdistetty jaetun ID-sarakkeen kautta.
  • 🔗 Neljä liitostyyppiä: Sisä-, vasen ulompi, oikea ulompi ja täysi ulompi liitos säilyttävät kukin eri joukon yhteensopimattomia rivejä.
  • NULL merkitsee aukon: Ulkoliitos palauttaa rivin, vaikka vastinetta ei olisikaan, täyttäen jokaisen puuttuvan puolen sarakkeen NULL-arvolla.
  • 🔁 Tilauksella on merkitystä: Liitokset eivät ole vaihdannaisia ​​ja ne ovat vasemmalle assosiatiivisia, joten vaihdaping taulukot muuttavat ulkoisen liitoksen tulosta.
  • 🧮 Alikyselyt sisäkkäisiä kyselyitä: Alikysely kirjoitetaan FROM- tai WHERE-lausekkeeseen, ja ulompi kysely riippuu sen palauttamasta arvosta.
  • 📜 TRANSFORM upottaa skriptejä: Mukautetut kartoitus- ja supistusskriptit suorittavat TRANSFORM-lauseen, kun mikään sisäänrakennettu funktio ei sovi.

Esimerkkejä pesän liittämisestä ja alikyselyistä

Liity kyselyihin

Liitoskyselyitä voidaan suorittaa kahdelle taulukolle, jotka ovat läsnä HiveYmmärtääksemme liitosten käsitteet selkeästi, luomme tähän kaksi taulukkoa:

  • sample_joins (asiakastietoihin liittyvä)
  • sample_joins1 (liittyy työntekijöiden tekemiin tilaustietoihin)

Vaihe 1) Taulukon ”sample_joins” luonti sarakenimillä Id, Name, Age, Address ja Palkka. Alla olevassa kuvakaappauksessa näkyy CREATE TABLE -komento ja sen vahvistus.

Hive CREATE TABLE -lauseke sample_joins-asiakastaulukolle

Vaihe 2) Tietojen lataaminen ja näyttäminen. Seuraavassa kuvakaappauksessa näkyy latauskomento ja sen jälkeen taulukon sisältö.

Asiakkaat.txt-tiedoston lataaminen esimerkkiliitoksiin ja ladattujen rivien näyttäminen

Yllä olevasta kuvakaappauksesta:

  1. Ladataan tietoja sample_joins -tiedostoon Customers.txt-tiedostosta
  2. Näytetään sample_joins -taulukon sisältö

Vaihe 3) sample_joins1-taulukon luominen ja sen tietojen lataaminen ja näyttäminen alla olevan kuvakaappauksen mukaisesti.

sample_joins1:n luonti, orders.txt-tiedoston lataus ja tilausrivien näyttäminen

Yllä olevasta kuvakaappauksesta voimme havaita seuraavaa:

  1. Taulukon sample_joins1 luonti sarakkeilla Orderid, Date1, Id ja Amount
  2. Ladataan tietoja tiedoston sample_joins1 tiedostosta orders.txt
  3. Näytetään tietueet, jotka ovat kohdassa sample_joins1

Jatkossa tarkastelemme erilaisia ​​liitostyyppejä, joita voidaan suorittaa luomillemme taulukoille. Ennen sitä on otettava huomioon seuraavat liitoksiin liittyvät seikat.

Joitakin huomioitavia seikkoja liitoksissa:

  • Liitoksissa sallitaan vain yhtäsuuruusliitokset
  • Useampi kuin kaksi taulukkoa voidaan yhdistää samaan kyselyyn
  • LEFT-, RIGHT- ja FULL OUTER -liitokset on olemassa, jotta voidaan hallita paremmin ON-lauseketta, jolle ei ole vastinetta.
  • Liitokset eivät ole vaihdannaisia
  • Liitokset ovat vasen-assosiatiivisia riippumatta siitä, ovatko ne LEFT- vai RIGHT-liitoksia

Tasa-arvorajoitus heijastaa Hiveä sellaisena kuin se oli useiden vuosien ajan. Hive 2.2.0:sta eteenpäin ON-lausekkeen monimutkaisia ​​lausekkeita tuetaan (HIVE-15211), joten ei-tasa-arvoehto hyväksytään nykyisessä versiossa. Vanhemmissa versioissa ehdon on oltava tasa-arvotesti, ja kaikki muu siirretään WHERE-lausekkeeseen.

Erilaiset liitokset

Liitoksia on neljää tyyppiä. Nämä ovat:

  • Sisäinen liittyminen
  • Vasen ulompi liitos
  • Oikea ulompi liitos
  • Täysi ulkoliitos

Kutakin tyyppiä esitellään alla samoja kahta taulukkoa vasten, joten esimerkkien välillä muuttuu vain se, mitkä yhteensopimattomat rivit säilyvät.

Sisäinen liittyminen

Molemmille taulukoille yhteiset tietueet noudetaan tällä sisäisellä liitoksella. Alla olevan kuvakaappauksen tulos sisältää vain ne asiakkaat, joilla on vastaava tilaus.

Hiven sisäisen liitoksen tuloste, joka näyttää vain asiakkaat, joilla on vastaava tilaus

Yllä olevasta kuvakaappauksesta voimme havaita seuraavaa:

  1. Tässä suoritamme liitoskyselyn käyttämällä JOIN-avainsanaa taulukoiden sample_joins ja sample_joins1 välillä vastaavuusehdolla (c.Id = o.Id).
  2. Tuloste näyttää molemmissa taulukoissa olevat yhteiset tietueet, jotka on valittu kyselyssä mainitun ehdon perusteella.

kysely:

SELECT c.Id, c.Name, c.Age, o.Amount FROM sample_joins c JOIN sample_joins1 o ON(c.Id=o.Id);

Vasen ulompi liittymä

  • HiveQL LEFT OUTER JOIN palauttaa kaikki vasemman taulukon rivit, vaikka oikean taulukon rivillä ei olisikaan osumia.
  • Jos ON-lauseke ei vastaa oikean taulukon tietueita, liitos palauttaa silti tulokseen tietueen, jonka jokaisessa oikean taulukon sarakkeessa on NULL.

Alla olevassa kuvakaappauksessa näkyy, että kaikki asiakkaat näkyvät, myös ne, joilla ei ole tilausta.

Hive vasemmanpuoleinen ulompi liitostulostus NULL-arvoilla asiakkaille, joilla ei ole tilauksia

Yllä olevasta kuvakaappauksesta voimme havaita seuraavaa:

  1. Tässä suoritamme liitoskyselyn käyttämällä avainsanaa ”LEFT OUTER JOIN” taulukoiden sample_joins ja sample_joins1 välille ja vastaavuusehtoa (c.Id = o.Id). Esimerkiksi tässä käytämme työntekijän tunnusta viitteenä; se tarkistaa, onko tunnus yhteinen sekä oikean että vasemman taulukon kanssa. Se toimii vastaavuusehtona.
  2. Tuloste näyttää kyselyssä mainitun ehdon valitsemat tietueet. Yllä olevan tulosteen NULL-arvot ovat sarakkeita, joissa ei ole arvoja oikeanpuoleisesta taulukosta, eli sample_joins1:stä.

kysely:

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c LEFT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Oikea ulompi liitos

  • HiveQL RIGHT OUTER JOIN palauttaa kaikki rivit oikeasta taulukosta, vaikka vasemmassa taulukossa ei olisikaan osumia
  • Jos ON-lauseke ei vastaa vasemmanpuoleisessa taulukossa olevia tietueita, liitos palauttaa silti tulokseen tietueen, jonka jokaisessa vasemmanpuoleisen taulukon sarakkeessa on NULL.
  • OIKEAT liitokset palauttavat aina tietueet oikeanpuoleisesta taulukosta ja vastaavat tietueet vasemmanpuoleisesta taulukosta. Jos vasemmanpuoleisessa taulukossa ei ole saraketta vastaavaa arvoa, se palauttaa kyseiseen kohtaan NULL-arvoja.

Alla oleva kuvakaappaus näyttää edellisen tuloksen peilikuvan: jokainen tilaus tulee näkyviin, täsmäämisestä riippumatta.

Hive oikeanpuoleinen ulompi liitos, lähtö keeping jokainen tilausrivi sample_joins1-funktiosta

Yllä olevasta kuvakaappauksesta voimme havaita seuraavaa:

  1. Tässä suoritamme liitoskyselyn käyttämällä avainsanaa ”RIGHT OUTER JOIN” taulukoiden sample_joins ja sample_joins1 välillä vastaavuusehdolla (c.Id = o.Id).
  2. Tuloste näyttää kyselyssä mainitun ehdon perusteella valitut tietueet.

kysely:

  SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c RIGHT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Täysi ulkoinen liittyminen

Se yhdistää sekä sample_joins- että sample_joins1-taulukoiden tietueet kyselyssä annetun JOIN-ehdon perusteella.

Se palauttaa kaikki tietueet molemmista taulukoista ja täyttää NULL-arvoilla sarakkeet, joiden vastaavat arvot puuttuvat kummaltakin puolelta, kuten alla oleva kuvakaappaus osoittaa.

Hiven täydellinen ulkoliitoksen tuloste, joka yhdistää molempien taulukoiden yhteensopimattomat rivit

Yllä olevasta kuvakaappauksesta voimme havaita seuraavaa:

  1. Tässä suoritamme liitoskyselyn käyttämällä avainsanaa ”FULL OUTER JOIN” taulukoiden sample_joins ja sample_joins1 välillä vastaavuusehdolla (c.Id = o.Id).
  2. Tuloste näyttää kaikki molemmissa taulukoissa olevat tietueet, jotka on valittu kyselyssä mainitun ehdon perusteella. Tulosteen NULL-arvot osoittavat tässä puuttuvat arvot molempien taulukoiden sarakkeista.

kysely:

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c FULL OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Alakyselyt

Liitokset asettavat taulukoita vierekkäin. Alikysely tekee jotain erilaista: se sijoittaa yhden kyselyn toisen sisään, jotta ulompi kysely voi toimia jo lasketun tuloksen pohjalta.

Kyselyn sisällä olevaa kyselyä kutsutaan alikyselyksi. Pääkysely riippuu alikyselyn palauttamista arvoista.

Alikyselyt voidaan luokitella kahteen tyyppiin:

  • FROM-lausekkeen alikyselyt
  • Alikyselyt WHERE-lausekkeessa

Milloin käyttää:

  • Tietyn arvon yhdistäminen kahdesta sarakearvosta eri taulukoista
  • Yhden taulukon arvojen riippuvuus muista taulukoista
  • Yhden sarakkeen arvojen vertaileva tarkistaminen muihin taulukoihin

Syntaksi:

Subquery in FROM clause
SELECT <column names 1, 2…n>From (SubQuery) <TableName_Main >
Subquery in WHERE clause
SELECT <column names 1, 2…n> From<TableName_Main>WHERE col1 IN (SubQuery);

Esimerkiksi:

SELECT col1 FROM (SELECT a+b AS col1 FROM t1) t2

Tässä t1 ja t2 ovat taulukoiden nimiä. Sisäinen lauseke on taulukolle t1 suoritettava alikysely. Tässä a ja b ovat sarakkeita, jotka lisätään alikyselyyn ja jotka on määritetty sarakkeeseen col1. Col1 on päätaulukossa olevan sarakkeen arvo. Alikyselyssä oleva sarake ”col1” vastaa päätaulukon sarakkeen col1 kyselyä.

Mukautettujen komentosarjojen upottaminen

Kun alikysely muokkaa dataa pelkällä HiveQL:llä, upotettu skripti luovuttaa rivit Hiven ulkopuolella kirjoitetulle koodille.

Hive mahdollistaa käyttäjäkohtaisten skriptien kirjoittamisen asiakasvaatimuksia varten. Käyttäjät voivat kirjoittaa oman map-mapin ja lyhentää skriptejä näitä vaatimuksia varten. Näitä kutsutaan upotetuiksi mukautetuiksi skripteiksi. Koodauslogiikka määritellään mukautetussa skriptissä, ja voimme käyttää kyseistä skriptiä ETL-aikana.

Milloin valita upotetut skriptit:

  • Asiakaskohtaiset vaatimukset tarkoittavat, että kehittäjien on kirjoitettava ja otettava käyttöön skriptejä Hivessä
  • Missä Hiven sisäänrakennetut funktiot eivät toimi tietyissä verkkotunnusvaatimuksissa

Tätä varten Hive käyttää TRANSFORM-lauseketta sekä map- että reduktoriskriptien upottamiseen.

Näissä upotetuissa mukautetuissa komentosarjoissa meidän on otettava huomioon seuraavat seikat:

  • Sarakkeet muunnetaan merkkijonoiksi ja erotetaan sarkaimella ennen kuin ne annetaan käyttäjälle skriptillä.
  • Käyttäjän komentosarjan vakiotulostetta käsitellään sarkaimilla eroteltuina merkkijonoina.

Upotetun skriptin esimerkki:

FROM (
	FROM pv_users
	MAP pv_users.userid, pv_users.date
	USING 'map_script'
	AS dt, uid
	CLUSTER BY dt) map_output

INSERT OVERWRITE TABLE pv_users_reduced
	REDUCE map_output.dt, map_output.uid
	USING 'reduce_script'
	AS date, count;

Yllä olevasta skriptistä voimme havaita seuraavaa. Tämä on vain esimerkkiskripti ymmärryksen helpottamiseksi.

  • pv_users on käyttäjät-taulukko, jossa on kenttiä, kuten käyttäjätunnus ja päivämäärä, kuten map_script-tiedostossa mainitaan.
  • Reducer-skripti määritellään pv_users-taulukon päivämäärän ja lukumäärän perusteella.

UKK

Historiallisesti ei. Hive 2.2.0:sta alkaen monimutkaiset lausekkeet ovat sallittuja ON-lausekkeessa (HIVE-15211), joten epäyhtälö- ja väliehdot toimivat. Aiemmissa versioissa ON-lauseen on oltava yhtäsuuruustesti ja kaikki muut predikaatit kuuluvat WHERE-lausekkeeseen.

Karttaliitos lataa pienemmän taulukon muistiin ja ohittaa pienennysvaiheen kokonaan. Hive valitsee sen automaattisesti, kun hive.auto.convert.join on tosi ja taulukko täyttää määritetyn kokokynnyksen, mikä tekee pienistä suuriin liitoksista paljon nopeampia.

Se palauttaa vasemmanpuoleisesta taulukosta rivit, joilla on vähintään yksi osuma oikealla puolella, kopioimatta niitä ja palauttamatta oikeanpuoleisia sarakkeita. Oikeanpuoleiseen taulukkoon saa viitata vain ON-lausekkeessa, ei SELECT- tai WHERE-lausekkeissa.

Osittain. Hive 0.13:sta alkaen IN-, NOT IN-, EXISTS- ja NOT EXISTS -operaattorit hyväksyvät WHERE-lausekkeen alikyselyt, mukaan lukien korreloivat kyselyt. Rajoituksia on edelleen, joten ei-tuettu korrelaatio kirjoitetaan yleensä uudelleen liitokseksi.

Sisäisestä kyselystä tulee johdettu taulukko, ja jokainen taulukko tarvitsee nimen ennen kuin sen sarakkeisiin voidaan viitata. Siksi esimerkki päättyy sulkevan hakasulkeen jälkeen merkkiin t2; aliaksen poisjättäminen aiheuttaa jäsennysvirheen.

Kun yksi liitosavain sisältää suhteettoman suuren osan riveistä, yksi reduktori saa suurimman osan työstä, kun taas muut ovat käyttämättömiä. Hive.optimize.skewjoin-määrityksen asettaminen tai raskaan avaimen jakaminen ja tulosten yhdistäminen jakaa kuormitusta.

Koneoppimisavustajat lukevat EXPLAIN-suunnitelman ja merkitsevät yleisiä syitä, kuten puuttuvan osiosuodattimen, muuntamattoman karttaliitoksen tai vinon avaimen. Käytä ehdotusta lähtökohtana ja vahvista se suunnitelmaa ja todellista suoritusympäristöä vasten.

Se luonnostelee lyhyestä kommentista hyvin standardinmukaisia ​​liitos- ja alikyselymalleja. Tarkista kaikki hakukonekohtainen, koska se sekoittuu helposti Spark SQL- tai Presto-syntaksi, ja Hive hylkää konstruktit, kuten aliasoimattoman johdetun taulukon.

Tiivistä tämä viesti seuraavasti: