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.

  • ๐Ÿงฑ Tvรฅ exempeltabeller: sample_joins innehรฅller kunduppgifter och sample_joins1 innehรฅller orderuppgifter, kopplade till den delade ID-kolumnen.
  • ๐Ÿ”— Fyra kopplingstyper: Inre, vรคnstra yttre, hรถgra yttre och fullstรคndiga yttre kopplingar behรฅller alla en annan uppsรคttning omatchade rader.
  • โฌœ NULL markerar gapet: En outer join returnerar en rad รคven utan matchning, och fyller varje kolumn frรฅn den saknade sidan med NULL.
  • ๐Ÿ” Ordningsfrรฅgor: Joins รคr inte kommutativa och รคr vรคnsterassociativa, sรฅ bytping tabellerna รคndrar ett resultat av en outer join.
  • ๐Ÿงฎ Underfrรฅgor kapslar frรฅgor: En delfrรฅga skrivs i FROM-klausulen eller WHERE-klausulen, och den yttre frรฅgan beror pรฅ det vรคrde den returnerar.
  • ๐Ÿ“œ TRANSFORM bรคddar in skript: Anpassade mappnings- och reduceringsskript kรถrs genom TRANSFORM-klausulen nรคr ingen inbyggd funktion passar.

Exempel pรฅ Hive-kopplingar och underfrรฅgor

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.

Hive CREATE TABLE-instruktion fรถr kundtabellen sample_joins

Steg 2) Laddar och visar data. Nรคsta skรคrmdump visar kommandot load fรถljt av innehรฅllet i tabellen.

Laddar Customers.txt i sample_joins och visar de inlรคsta raderna

Frรฅn skรคrmdumpen ovan:

  1. Laddar data till sample_joins frรฅn Customers.txt
  2. 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.

Skapa sample_joins1, ladda orders.txt och visa orderraderna

Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:

  1. Skapande av tabellen sample_joins1 med kolumnerna Orderid, Date1, Id och Amount
  2. Laddar data till sample_joins1 frรฅn orders.txt
  3. 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.

Hive Inner Join-utdata visar endast kunder som har en matchande order

Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:

  1. 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).
  2. 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.

Hive vรคnster yttre kopplingsutdata med NULL-vรคrden fรถr kunder utan ordrar

Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:

  1. 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.
  2. 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.

Hive hรถger yttre koppling utdata keeping varje orderrad frรฅn sample_joins1

Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:

  1. 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).
  2. 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.

Hive full outer join-utdata som kombinerar omatchade rader frรฅn bรฅda tabellerna

Frรฅn skรคrmdumpen ovan kan vi observera fรถljande:

  1. 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).
  2. 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.

Vanliga frรฅgor

Historiskt sett nej. Frรฅn Hive 2.2.0 รคr komplexa uttryck tillรฅtna i ON-klausulen (HIVE-15211), sรฅ olikhets- och intervallvillkor fungerar. I tidigare versioner mรฅste ON-klausulen vara ett likhetstest och alla andra predikat hรถr hemma i WHERE.

En mappningskoppling laddar den mindre tabellen i minnet och hoppar รถver reduceringssteget helt. Hive vรคljer den automatiskt nรคr hive.auto.convert.join รคr sant och tabellen passar den konfigurerade storlekstrรถskeln, vilket gรถr smรฅ-till-stora kopplingar mycket snabbare.

Den returnerar rader frรฅn den vรคnstra tabellen som har minst en matchning till hรถger, utan att duplicera dem och utan att returnera hรถgersidiga kolumner. Den hรถgra tabellen fรฅr bara refereras i ON-klausulen, inte i SELECT eller WHERE.

Delvis. Frรฅn och med Hive 0.13 accepterar operatorerna IN, NOT IN, EXISTS och NOT EXISTS delfrรฅgor i WHERE-klausulen, inklusive korrelerade. Begrรคnsningar kvarstรฅr, sรฅ en korrelation som inte stรถds skrivs vanligtvis om som en join.

Den inre frรฅgan blir en hรคrledd tabell, och varje tabell behรถver ett namn innan dess kolumner kan refereras. Det รคr dรคrfรถr exemplet avslutas med t2 efter den avslutande hakparentesen; att utelรคmna aliaset ger upphov till ett parsningsfel.

Nรคr en join-nyckel innehรฅller en oproportionerligt stor andel rader, tar en enda reducerare emot det mesta av arbetet medan andra gรฅr pรฅ tomgรฅng. Att sรคtta hive.optimize.skewjoin, eller att dela upp den tunga nyckeln och sammanfoga resultaten, sprider belastningen.

Maskininlรคrningsassistenter lรคser EXPLAIN-planen och flaggar vanliga orsaker, sรฅsom ett saknat partitionsfilter, en okonverterad mappningskoppling eller en sned nyckel. Behandla fรถrslaget som en utgรฅngspunkt och bekrรคfta det mot planen och den faktiska kรถrtiden.

Den utarbetar standard join- och subquery-mรถnster bra frรฅn en kort kommentar. Verifiera allt motorspecifikt, eftersom det enkelt blandas in. Spark SQL- eller Presto-syntax, och Hive avvisar konstruktioner som en oaliaserad hรคrledd tabell.

Sammanfatta detta inlรคgg med: