SQL Pivot: Konvertering av rader til kolonner

Prøv denne notatblokken i Databricks

OPPDATERT 11/10/2018

Pivot ble først introdusert i Apache Spark 1.6 som en ny DataFrame-funksjon som lar brukerne rotere et tabellverdig uttrykk ved å gjøre de unike verdiene fra en kolonne til individuelle kolonner.

Apache Spark 2.4-utgivelsen utvider også denne kraftige funksjonaliteten til å svinge data til våre SQL-brukere. I denne bloggen, ved bruk av temperaturopptak i Seattle, viser vi hvordan vi kan bruke denne vanlige SQL Pivot-funksjonen for å oppnå komplekse datatransformasjoner.

Undersøk sommertemperaturer med Pivot

Denne sommeren i Seattle steg temperaturene til ubehagelige nivåer og toppet seg til høye 80- og 90-tallet i ni dager i juli.

Dato Temp (° F)
07-22-2018 86
23-23-2018 90
24-07-2018 91
07-25-2018 92
07-26-2018 92
07-27-2018 88
07-28-2018 85
07-29-2018 94
07-30-2018 89

Anta at vi vil utforske eller undersøke om det var en historisk tren d i økende kvikksølvnivå. En intuitiv måte å undersøke og presentere disse tallene på er å ha måneder som kolonnene og deretter hvert års månedlige gjennomsnittlige høyder i en enkelt rad. På den måten vil det være enkelt å sammenligne temperaturene både horisontalt, mellom tilstøtende måneder og vertikalt, mellom forskjellige år.

Nå som vi har støtte for PIVOT syntaks i Spark SQL kan vi oppnå dette med følgende SQL-spørring.

Spørringen ovenfor vil gi et resultat som:

Vel, ser ut som det er gode år og dårlige år. Året 2016 virker et ganske energivennlig år.

Sving i SQL

La oss se nærmere på dette spørsmålet for å forstå hvordan det fungerer. Først må vi spesifisere FROM -satsen, som er inngangen til pivoten, med andre ord tabellen eller underforespørselen basert på hvilken pivoteringen vil bli utført. I vårt tilfelle er vi bekymret for årene, månedene og de høye temperaturene, så det er feltene som vises i delspørringen.

For det andre, la oss vurdere en annen viktig del av spørringen, PIVOT klausulen. Det første argumentet i PIVOT -setningen er en samlet funksjon og kolonnen som skal aggregeres. Vi spesifiserer deretter pivotkolonnen i FOR underklausul som det andre argumentet, etterfulgt av IN -operatøren som inneholder pivot-kolonneverdiene som det siste argumentet.

Pivot-kolonnen er punktet rundt hvilket tabellen skal roteres, og pivot-kolonneverdiene vil bli transponert til kolonner i utgangstabellen. IN -klausulen lar deg også spesifisere et alias for hver pivotverdi, noe som gjør det enkelt å generere mer meningsfulle kolonnenavn.

En viktig ide om pivot er at den utfører en gruppert aggregering basert på en liste over implisitte group-by kolonner sammen med pivotkolonnen. De implisitte group-by -kolonnene er kolonner fra FROM -satsen som ikke vises i noen samlet funksjon eller som pivotkolonnen.

I den ovennevnte spørringen, med pivotkolonnen som kolonnemåned og den implisitte group-by -kolonnen som kolonneåret, er uttrykket avg(temp) vil bli samlet på hvert distinkt verdipar av (year, month), der måneden tilsvarer en av de angitte pivotkolonneverdiene. Som et resultat vil hver av disse samlede verdiene bli kartlagt i den tilsvarende cellen i rad year og column måned.

Det er verdt å merke seg at på grunn av denne implisitte group-by, må vi sørge for at enhver kolonne som vi ikke ønsker å være en del av pivotutgangen, skal utelates fra FROM klausul, ellers ville spørringen gi uønskede resultater.

Spesifisere flere samlede uttrykk

Eksemplet ovenfor viser bare ett samlet uttrykk som brukes i PIVOT -klausulen, mens brukerne faktisk kan spesifisere flere samlede uttrykk om nødvendig. Igjen, med værdataene ovenfor, kan vi liste opp de høyeste høye temperaturene sammen med de gjennomsnittlige høye temperaturene mellom juni og september.

Ved flere samlede uttrykk vil kolonnene være det kartesiske produktet av dreietappen kolonneverdier og samlede uttrykk, med navnene som <value>_<aggExpr>.

Gruppering av kolonner kontra pivotkolonner

Anta at vi vil inkludere lave temperaturer i utforskingen av temperaturtrender fra denne tabellen over daglige lave temperaturer:

Dato Temp (° F)
08-01-2018 59
08-02-2018 58
08-03-2018 59
08-04-2018 58
08-05-2018 59
08-06-2018 59

For å kombinere denne tabellen med den forrige tabellen over daglige høye temperaturer, kan vi bli med i disse to tabellene i kolonnen «Dato». Siden vi skal bruke pivot, som utfører gruppering på datoene, vil vi kan bare sammenkoble de to tabellene ved hjelp av UNION ALL. Og du vil se senere, denne tilnærmingen gir oss også mer fleksibilitet:

La oss nå prøve vår pivot-spørring med den nye kombinerte tabellen:

Som et resultat får vi gjennomsnittet høyt og gjennomsnittlig lavt for hver måned de siste 4 årene i en tabell. Merk at vi må inkludere kolonnen flag i pivot-spørringen, ellers ville uttrykket avg(temp) være basert på en blanding av høyt og lavt temperaturer.

Du har kanskje lagt merke til at nå har vi to rader for hvert år, en for høye temperaturer og den andre for lave temperaturer. Det er fordi vi har tatt med en kolonne til, flag, i pivotinngangen, som igjen blir en annen implisitt grupperingskolonne i tillegg til den originale kolonnen year.

Alternativt, i stedet for å være en grupperingskolonne, kan flag også tjene som en pivotkolonne. Så nå har vi to pivotkolonner, month og flag:

Dette spørsmålet gir oss et annet oppsett av de samme dataene, med en rad for hvert år, men to kolonner for hver måned.

Hva er neste

For å kjøre spørreeksemplene som brukes i denne bloggen, vennligst sjekk pivot SQL-eksemplene i denne medfølgende notatblokken.

Takk til bidragsyterne fra Apache Spark-fellesskapet for deres bidrag!

Prøv Databricks gratis. Kom i gang i dag

Write a Comment

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *