SQL Pivot: Sorok konvertálása oszlopokká

Próbálja ki ezt a jegyzetfüzetet Databricks-ben

Frissítve 2018.11.10.

A Pivot először az Apache Spark 1.6-ban került bevezetésre, mint új DataFrame szolgáltatás, amely lehetővé teszi a felhasználók számára, hogy egy táblázat által értékelt kifejezést forgassanak azáltal, hogy az oszlopok egyedi értékeit egyedi oszlopokká alakítják.

Az Apache Spark 2.4 kiadás kiterjeszti az adatok elfordításának ezt a hatékony funkcióját az SQL felhasználóinkra is. Ebben a blogban a hőmérséklet-felvételek felhasználásával Seattle-ben megmutatjuk, hogyan használhatjuk ezt a közös SQL Pivot szolgáltatást komplex adatátalakítások eléréséhez.

Nyári hőmérsékletek vizsgálata a Pivot segítségével

Idén nyáron Seattle-ben a hőmérséklet júliusban kilenc napig kényelmetlen szintre emelkedett, a 80-as és a 90-es csúcsra emelkedett.

Dátum Hőmérséklet (° F)
07-22-2018 86
2018-07-23 90
2018-04-24 91
2018-25-25 92
2018-07-26 92
2018-07-27 88
2018-08-28 85
2018-09-29 94
2018-30-30 89

Tegyük fel, hogy szeretnénk feltárni vagy megvizsgálni, hogy voltak-e történelmi árkok d az emelkedő higanyszintben. E számok vizsgálatának és bemutatásának egyik intuitív módja az, hogy hónapok szerepelnek oszlopként, majd az egyes évek havi átlaga egyetlen sorban. Így könnyű lesz összehasonlítani a hőmérsékleteket vízszintesen, a szomszédos hónapok között és függőlegesen, a különböző évek között.

Most, hogy támogatjuk a PIVOT szintaxist a Spark SQL-ben ezt a következő SQL lekérdezéssel érhetjük el.

A fenti lekérdezés olyan eredményt hoz létre, mint:

Nos, úgy tűnik, vannak jó és rossz évek. A 2016-os év meglehetősen energiatakarékos évnek tűnik.

Fordulás SQL-ben

Vizsgáljuk meg közelebbről ezt a lekérdezést, hogy megértsük a működését. Először meg kell adnunk a FROM záradékot, amely a pivot bemenete, más szóval azt a táblázatot vagy allekérdezést, amely alapján a pivot végrehajtásra kerül. Esetünkben aggódunk az évek, a hónapok és a magas hőmérséklet miatt, ezért ezek a mezők jelennek meg az allekérdezésben.

Másodszor vegyük fontolóra a lekérdezés egy másik fontos részét, a PIVOT záradék. A PIVOT záradék első argumentuma összesítő függvény és az összesítendő oszlop. Ezután a FOR albekezdésben a pivot oszlopot adjuk meg második argumentumként, majd a IN operátort, amely a pivot oszlop értékeit tartalmazza, az utolsó argumentum.

A pivot oszlop az a pont, amely körül a táblát elforgatják, és a pivot oszlop értékei átkerülnek a kimeneti táblázat oszlopaiba. A IN záradék lehetővé teszi egy álnév megadását az egyes kimutatási értékekhez, megkönnyítve ezzel az értelmesebb oszlopnevek létrehozását.

A kimutatás fontos ötlete, hogy csoportosított összesítést hajt végre az implicit group-by oszlopok listája és a forgóoszlop mellett. Az implicit group-by oszlopok a FROM záradék oszlopai, amelyek nem jelennek meg összesítő függvényben vagy kimutatható oszlopként.

A fenti lekérdezésben, amikor a pivot oszlop az oszlop hónapja, és az implicit group-by oszlop az oszlop éve, a avg(temp) a (year, month) minden egyes különálló értékpárján összesítésre kerül, ahol a hónap megegyezik a megadott pivot oszlopértékek egyikével. Ennek eredményeként ezek az összesített értékek a year és a column hónap megfelelő cellájába kerülnek leképezésre.

Érdemes megjegyezni, hogy emiatt az implicit group-by miatt meg kell győződnünk arról, hogy minden oszlopot, amely nem kívánjuk, hogy a pivot kimenet része legyen, hagyja ki az FROM záradék, különben a lekérdezés nem kívánt eredményeket eredményez.

Több összesített kifejezés megadása

A fenti példa csak egy összesített kifejezést mutat be a PIVOT záradékban, míg valójában a felhasználók több összesített kifejezést is megadhatnak, ha szükséges. Ismét a fenti időjárási adatokkal felsorolhatjuk a maximális magas hőmérsékleteket, valamint az átlagos magas hőmérsékleteket június és szeptember között.

Több összesített kifejezés esetén az oszlopok a tengely derékszögű szorzata oszlopértékek és az összesített kifejezések <value>_<aggExpr> névvel.

Oszlopok és forgóoszlopok csoportosítása

Most tegyük fel, hogy az alacsony hőmérsékleteket be akarjuk vonni a hőmérsékleti trendek feltárásába a napi alacsony hőmérsékletek táblázatából:

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

Ha ezt a táblázatot össze akarjuk kapcsolni az előző napi magas hőmérsékleti táblázattal, ezt a két táblázatot összekapcsolhatjuk a “Dátum” oszlopban. Mivel azonban a pivot-ot fogjuk használni, amely csoportosítást végez a dátumokon, akkor egyszerűen összefűzheti a két táblázatot a UNION ALL. És később meglátjuk, ez a megközelítés nagyobb rugalmasságot is biztosít számunkra:

Most próbáljuk ki a pivot lekérdezést az új kombinált táblával:

Ennek eredményeként egy táblázatban megkapjuk az elmúlt 4 év minden hónapjának átlagát és átlagát. Ne feledje, hogy a flag oszlopot bele kell foglalnunk a kimutatásba, különben a avg(temp) kifejezés a magas és az alacsony keverékén alapulna hőmérsékleteket.

Észrevehette, hogy most minden évben két sor áll rendelkezésünkre, az egyik a magas hőmérsékletre, a másik az alacsony hőmérsékletre. Ez azért van, mert még egy oszlopot, flag beillesztettünk a pivot bemenetbe, amely az eredeti year.

Alternatív megoldásként ahelyett, hogy csoportosító oszlop lenne, a flag is oszlopként szolgálhat. Tehát most két forgóoszlopunk van: month és flag:

Ez a lekérdezés más elrendezést mutat be nekünk ugyanazok az adatok, minden évben egy sorral, de havonta két oszloppal.

Mi következik

A blogban használt lekérdezési példák futtatásához ellenőrizze a pivot SQL példákat ebben a kísérő jegyzetfüzetben.

Köszönjük az Apache Spark közösség közreműködőinek a hozzájárulásukat!

Próbálja ki ingyen a Databricks alkalmazást. Kezdje még ma

Write a Comment

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük