Hive Join & SubQuery Handledning med exempel
โก Smart sammanfattning
Hive-kopplingar kombinerar rader frรฅn tvรฅ eller flera tabeller i en matchande kolumn, och underfrรฅgor kapslar en frรฅga inuti en annan, sรฅ bรฅda demonstreras hรคr pรฅ tvรฅ exempeltabeller som lรคsts in frรฅn vanliga textfiler.

Gรฅ med i frรฅgor
Join-frรฅgor kan utfรถras pรฅ tvรฅ tabeller som finns i BikupaFรถr att fรถrstรฅ kopplingskoncept tydligt skapar vi tvรฅ tabeller hรคr:
- sample_joins (relaterat till kunduppgifter)
- sample_joins1 (relaterat till orderuppgifter som lagts av anstรคllda)
Steg 1) Skapande av tabellen "sample_joins" med kolumnnamnen Id, Namn, ร lder, adress och lรถn fรถr de anstรคllda. Skรคrmdumpen nedan visar CREATE TABLE-satsen och dess bekrรคftelse.
Steg 2) Laddar och visar data. Nรคsta skรคrmdump visar kommandot load fรถljt av innehรฅllet i tabellen.
Frรฅn skรคrmdumpen ovan:
- Laddar data till sample_joins frรฅn Customers.txt
- Visar sample_joins-tabellinnehรฅll
Steg 3) Skapande av tabellen sample_joins1, sedan laddning och visning av dess data, som visas pรฅ skรคrmbilden nedan.
Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:
- Skapande av tabellen sample_joins1 med kolumnerna Orderid, Date1, Id och Amount
- Laddar data till sample_joins1 frรฅn orders.txt
- Visar poster som finns i sample_joins1
Framรถver ska vi se de olika typerna av joins som kan utfรถras pรฅ de tabeller vi har skapat. Innan dess mรฅste du รถvervรคga fรถljande punkter om joins.
Nรฅgra punkter att observera vid joins:
- Endast likhetskopplingar รคr tillรฅtna i kopplingar
- Fler รคn tvรฅ tabeller kan sammanfogas i samma frรฅga
- LEFT-, RIGHT- och FULL OUTER-kopplingar finns fรถr att ge mer kontroll รถver ON-klausulen som det inte finns nรฅgon matchning fรถr.
- Joins รคr inte kommutativa
- Joins รคr vรคnsterassociativa oavsett om de รคr LEFT- eller RIGHT-anslutningar
Likhetsbegrรคnsningen รฅterspeglar Hive som det var under mรฅnga รฅr. Frรฅn och med Hive 2.2.0 stรถds komplexa uttryck i ON-klausulen (HIVE-15211), sรฅ ett villkor som inte รคr likhet accepteras i en aktuell utgรฅva. I รคldre utgรฅvor mรฅste villkoret vara ett likhetstest, och allt annat flyttas till en WHERE-klausul.
Olika typer av sammanfogningar
Det finns fyra typer av kopplingar. Dessa รคr:
- Inre koppling
- Vรคnster yttre skarv
- Hรถger yttre fog
- Full ytterskarv
Varje typ demonstreras nedan mot samma tvรฅ tabeller, sรฅ det enda som รคndras mellan exemplen รคr vilka omatchade rader som รถverlever.
Inre koppling
Posterna som รคr gemensamma fรถr bรฅda tabellerna hรคmtas av denna inre koppling. Resultatet i skรคrmbilden nedan innehรฅller endast de kunder som har en matchande order.
Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:
- Hรคr utfรถr vi en join-frรฅga med hjรคlp av nyckelordet JOIN mellan tabellerna sample_joins och sample_joins1, med matchande villkor (c.Id = o.Id).
- Utdata visar de gemensamma posterna som finns i bรฅda tabellerna, valda genom att kontrollera villkoret som anges i frรฅgan.
Frรฅga:
SELECT c.Id, c.Name, c.Age, o.Amount FROM sample_joins c JOIN sample_joins1 o ON(c.Id=o.Id);
Vรคnster yttre anslutning
- HiveQL VรNSTER UTRE JOIN returnerar alla rader frรฅn den vรคnstra tabellen รคven om det inte finns nรฅgra matchningar i den hรถgra tabellen.
- Om ON-klausulen matchar noll poster i den hรถgra tabellen returnerar kopplingen fortfarande en post i resultatet med NULL i varje kolumn frรฅn den hรถgra tabellen.
Skรคrmdumpen nedan visar att alla kunder visas, inklusive de som inte har nรฅgon bestรคllning.
Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:
- Hรคr utfรถr vi en join-frรฅga med nyckelordet "LEFT OUTER JOIN" mellan tabellerna sample_joins och sample_joins1, med matchningsvillkoret (c.Id = o.Id). Till exempel anvรคnder vi hรคr anstรคllnings-ID:t som referens; det kontrollerar om id:t รคr gemensamt fรถr bรฅde den hรถgra och den vรคnstra tabellen. Det fungerar som matchningsvillkor.
- Utdata visar de poster som valts av villkoret som nรคmns i frรฅgan. NULL-vรคrden i utdata ovan รคr kolumner utan vรคrden frรฅn den hรถgra tabellen, det vill sรคga sample_joins1.
Frรฅga:
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c LEFT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
Hรถger yttre anslutning
- HiveQL RIGHT OUTER JOIN returnerar alla rader frรฅn den hรถgra tabellen รคven om det inte finns nรฅgra matchningar i den vรคnstra tabellen.
- Om ON-klausulen matchar noll poster i den vรคnstra tabellen returnerar kopplingen fortfarande en post i resultatet med NULL i varje kolumn frรฅn den vรคnstra tabellen.
- RIGHT-kopplingar returnerar alltid poster frรฅn den hรถgra tabellen och matchande poster frรฅn den vรคnstra tabellen. Om den vรคnstra tabellen inte har nรฅgot vรคrde som motsvarar kolumnen, returnerar den NULL-vรคrden pรฅ den platsen.
Skรคrmdumpen nedan visar en spegelbild av fรถregรฅende resultat: varje bestรคllning visas, oavsett om den matchar eller inte.
Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:
- Hรคr utfรถr vi en join-frรฅga med hjรคlp av nyckelordet "RIGHT OUTER JOIN" mellan tabellerna sample_joins och sample_joins1, med matchande villkor (c.Id = o.Id).
- Utdata visar de poster som valts genom att kontrollera villkoret som anges i frรฅgan.
Frรฅga:
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c RIGHT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
Full yttre anslutning
Den kombinerar poster frรฅn bรฅde tabellerna sample_joins och sample_joins1 baserat pรฅ JOIN-villkoret som anges i frรฅgan.
Den returnerar alla poster frรฅn bรฅda tabellerna och fyller i NULL-vรคrden fรถr de kolumner vars matchande vรคrden saknas pรฅ nรฅgon av sidorna, som skรคrmdumpen nedan visar.
Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:
- Hรคr utfรถr vi en join-frรฅga med hjรคlp av nyckelordet "FULL OUTER JOIN" mellan tabellerna sample_joins och sample_joins1, med matchande villkor (c.Id = o.Id).
- Utdata visar alla poster som finns i bรฅda tabellerna, valda genom att kontrollera villkoret som nรคmns i frรฅgan. NULL-vรคrden i utdata hรคr anger de saknade vรคrdena i kolumnerna i bรฅda tabellerna.
Frรฅga:
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c FULL OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
Underfrรฅgor
Joins placerar tabeller sida vid sida. En delfrรฅga gรถr nรฅgot annorlunda: den kapslar en frรฅga inuti en annan sรฅ att den yttre frรฅgan kan arbeta utifrรฅn ett resultat som redan har berรคknats.
En frรฅga som finns inom en frรฅga kallas en delfrรฅga. Huvudfrรฅgan beror pรฅ de vรคrden som returneras av delfrรฅgan.
Delfrรฅgor kan delas in i tvรฅ typer:
- Delfrรฅgor i FROM-klausulen
- Delfrรฅgor i WHERE-klausulen
Nรคr du ska anvรคnda:
- Fรถr att fรฅ ett visst vรคrde kombinerat frรฅn tvรฅ kolumnvรคrden frรฅn olika tabeller
- Beroende av en tabells vรคrden pรฅ andra tabeller
- Jรคmfรถrande kontroll av en kolumns vรคrden mot andra tabeller
Syntax:
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);
Exempel:
SELECT col1 FROM (SELECT a+b AS col1 FROM t1) t2
Hรคr รคr t1 och t2 tabellnamn. Den inre satsen รคr delfrรฅgan som utfรถrs pรฅ tabell t1. Hรคr รคr a och b kolumner som lรคggs till i delfrรฅgan och tilldelas kolumn1. Kolumn1 รคr kolumnvรคrdet som finns i huvudtabellen. Kolumnen "kolumn1" som finns i delfrรฅgan motsvarar huvudtabellfrรฅgan i kolumn kolumn1.
Bรคdda in anpassade skript
Dรคr en delfrรฅga omformar data enbart med HiveQL, รถverfรถr ett inbรคddat skript rader till kod som skrivits utanfรถr Hive.
Hive gรถr det mรถjligt att skriva anvรคndarspecifika skript fรถr klientkrav. Anvรคndare kan skriva sina egna mappnings- och reduceringsskript fรถr dessa krav. Dessa kallas inbรคddade anpassade skript. Kodningslogiken definieras i det anpassade skriptet, och vi kan anvรคnda det skriptet vid ETL-tid.
Nรคr man ska vรคlja inbรคddade skript:
- Dรคr klientspecifika krav innebรคr att utvecklare mรฅste skriva och distribuera skript i Hive
- Dรคr inbyggda Hive-funktioner inte fungerar fรถr specifika domรคnkrav
Fรถr detta anvรคnder Hive TRANSFORM-klausulen fรถr att bรคdda in bรฅde map- och reducer-skript.
I dessa inbรคddade anpassade skript mรฅste vi observera fรถljande punkter:
- Kolumner kommer att omvandlas till strรคngar och avgrรคnsas med TAB innan de ges till anvรคndarskriptet.
- Standardutdata frรฅn anvรคndarskriptet kommer att behandlas som TAB-separerade strรคngkolumner
Exempel pรฅ inbรคddat skript:
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;
Frรฅn ovanstรฅende skript kan vi observera fรถljande. Detta รคr bara ett exempelskript fรถr fรถrstรฅelse.
- pv_users รคr tabellen users, som har fรคlt som userid och date som nรคmns i map_script.
- Reducer-skriptet definieras utifrรฅn datumet och antalet i pv_users-tabellen.







