Analýza a modelování dat Přednáška 8
OLAP, datová kostka, dotazování nad kostkou
Motivace většina DB relační zaznamenání vztahů pomocí logicky provázaných tabulek jakou mají velmi často vztahy povahu vztah nějakého subjektu k různým dimenzím příklad subjektů zákazník, zaměstnanec, transakce, výrobek příklad dimenzí čas, poloha (adresa...), peníze (cena/plat...)
Motivace Příklad: prodej výrobků zdroj: prezentace Data Cube, Luboš Kulič, Tomáš Kuthan
Motivace analýza dat informační systémy, účetnictví, potřeba pracovat s daty s přesnosti na každý záznam lidé (především analytici, manažeři atp.) potřebují celkový pohled agregovaná data Kolik jsem prodal od různych druhů vyrobků? Kolik jsem prodal po internetu? Kolik výrobků jsem prodal ve kterém městě Kolik výrobků jsem prodal ve kterém měsíci
potřebuji: Motivace analýza dat pohled na data z více dimenzí výhodné může být mít data i jinak uložena než relačně vhodný dotazovací jazyk umožňující analýzu (agregaci) klasické SQL nabízí jen GROUP BY seskupení dle jedné dimenze existuje řešení: datová kostka (CUBE)
rozšíření SQL99: Rozšíření SQL99 seskupovací operátory za GROUP BY CUBE statistiky dle řezů ROLLUP statistiky dle rolování nahoru - nadkrychle GROUPING SETS vlastní definice seskupujících množin díky těmto operátorům tvoříme v obyčejné relační databázi agregační dotazy nad tabulkami jako nad kostkou příště
MDX Dotazování pomocí MDX MultiDimensional expressions speciální dotazovací jazyk nad kostkami v rámci OLAP (OnLine Analytical Processing) navržen Microsoftem, standardizován podporován např. v Microsoft SQL Server Analysis Services nadstavba (nástroj) Microsoft SQL Serveru pro OLAP a data mining
Uložení kostky pro OLAP MOLAP - Multidimensional OLAP data a výsledky agregací jsou uloženy ve speciálním formátu ROLAP - Relational OLAP data a výsledky agregací jsou uloženy v relační databázi HOLAP Hybrid OLAP hybridní přístup MS podporuje všechny přístupy
Základní syntaxe SELECT osa1 ON COLUMNS, osa2 ON ROWS FROM kostka [ WHERE specifikace_řezu ] podobnost s SQL je pouze v klíčových slovech SELECT FROM, pracujeme s kostkou, ne s tabulkami
Základní syntaxe dotazy MDX nezpracovává databázový server, ale server OLAP (MS Analysis Services) jako klient může sloužit i MS excel MS Excel umí poslat serveru MS Analysis Services dotaz v MDX výsledek je primárně dvourozměrná tabulka tří a vícerozměrný se rozpadá na více dvourozměrných tabulek třírozměrný by mohl být akceptovatelný ve spojení s 3D brýlemi
Souřadnice bodů (2,4) (2015,Components)
Kostka tabulka prodej_baget takto by mohla být uložena kostka v ROLAP
Kostka Datum bod o souřadnicích (Trója, 30.10.2007,golf) má hodnotu 2 31.10.2007 30.10.2007 cvalík golf Trója Voršilská Menza Bageta
Kostka souřadnice (n-tice, tuple) (Trója, 30.10.2007,golf) neúplná souřadnice (Trója, 30.10.2007) jak se automaticky doplňují další? defaultní, jsou-li definovány všechny hodnoty agreguje se pro všechny členy v dané dimenzi první - pokud předchozí kroky nejsou aplikovatelné (např. u měr, které nemají all members) kostka vrátí z dané dimenze to první, co jí přijde pod ruku
Kostka koncepty: dimenze datum, bageta, menza míra (measure) počet prodaných kusů mohu mít i jiné míry cena, míra může být i vypočítaná zisk jako rozdíl tržeb a nákladů míru mohu chápat také jako další dimenzi (Trója, 30.10.2007,golf, 2)
zdroj: Jiří Neoral Kostka
Kostka co bychom viděli na předchozí obrazovce pro náš příklad? Cube prodej_baget Measure počet_kusu bageta datum menza
Dimenze dimenze mohou mít i úrovňovou hierarchii http://msdn.microsoft.com/en-us/library/aa216772(sql.80).aspx 2 dimenzionální míra, na data se můžeme dívat jako na 5 dimenzionální vektor (Source,Route,Time,Packages,Last)
Příklad: Dimenze rozšíření kostky prodeje na hierarchické dimenze: zachováme 3 dimenze a jednu míru prodané množství dimenze prodejního místa dimenze času dimenze výrobku
1. dimenze: dimenze místa Prodejna menza Voršilská Trója fakulta Právnická MFF
2. dimenze: dimenze času Čas rok pololetí1 leden 1.1.2016 únor pololetí2 červenec
3. dimenze: dimenze výrobku Výrobek bageta golf cvalík nápoj kofola pivo
Čas Kostka Výrobek Nápoj Bageta pivo kofola golf cvalík Trója Voršilská Menza Právnická MFF Fakulta Prodejna Výrobek Prodejna
Kostka přístup k datům [ ] : názvy dimenzí a souřadnic přístup přes hodnotu [Menza].[Trója] [Vyrobek].[Nápoj].[Kofola] přístup přes klíč [Menza].&[1] klíč hodnota pokud bychom samozřejmě měli v kolekci o Menzách definován klíč a klíčem by bylo ID
Kostka přístup k datům ( ) zbytek funkce, priorita matematických operací, n- tice ([Menza].[Trója],[Datum].[30.10.2007],[Bageta].[golf]) { } množiny (sety) souřadnic { ([Menza].[Trója],[Datum].[30.10.2007],[Bageta].[golf]), ([Menza].[Trója],[Datum].[30.10.2007],[Bageta].[golf]) }
Dotazy v DMX dotazy budeme formulovat nad kostkou bez hierarchie, pouze v některých případech použijeme hierarchii pro demonstraci nějakého jevu
Jednoduchý dotaz SELECT [DATUM].MEMBERS ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM prodej_baget MEMBERS znamená všechny hodnoty (pozice z dimenze), tj. všechny datumy a bagety
Jednoduchý dotaz dotaz agreguje prodeje: výsledek je tabulka: sloupce datumy řádky bagety 30.10.2007 31.10.2007 cvalík 9 11 golf 8 1
Jednoduchý dotaz odkazy na řádky a sloupce lze zapsat i ve formě čísel os sloupce: AXIS(0) řádky: AXIS(1) SELECT [DATUM].MEMBERS ON AXIX(0), [BAGETA].MEMBERS ON AXIS(1) FROM prodej_baget
Výběr pozice z dimenze SELECT [DATUM].[30.10.2007] ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM prodej_baget 30.10.2007 cvalík 9 golf 8
Výběr více pozic z dimenze uvažujme situaci, že dimenze Datum by měla více hodnot (pozic) 30.10.2007, 31.10.2007, 1.11.2007, atd. pokud bychom chtěli vybrat 2 pozice (pouze dva datumy do dvou sloupců), musíme z nich vytvořit množinu
SELECT Výběr více pozic z dimenze {[DATUM].[30.10.2017], [DATUM].[31.10.2017]} ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM prodej_baget 30.10.2007 31.10.2007 cvalík 9 11 golf 8 1
Výběr pozic z dimenze uvažujme hierarchický model chceme vypsat součet prodaných nápojů za celý rok do sloupců všechny prodejny do řádků pouze nápoje
Výběr pozic z dimenze Čas Prodejna Nápoj Bageta pivo kofola golf cvalík Trója Voršilská Menza Právnická MFF Fakulta Výrobek Prodejna
Výběr pozic z dimenze SELECT [PRODEJNA].MEMBERS ON COLUMNS, [VYROBEK].[NAPOJ].MEMBERS ON ROWS FROM prodej_baget Trója Voršilská Právnická MFF kofola XX ZZ AA BB pivo YY WW CC DD
Jednorozměrný výsledek agregační dotazy můžeme formulovat pouze do sloupců, tj. jednorozměrně v dotazu vynecháme ON ROWS osy nelze přeskakovat, nesmíme tedy vynechat ON COLUMNS a ponechat ON ROWS SELECT [DATUM].MEMBERS ON COLUMNS, FROM prodej_baget
Jednorozměrný výsledek sečte všechny prodeje dle datumů 30.10.2007 31.10.2007 17 12
Jednorozměrný výsledek chyba nelze přeskočit osy SELECT [DATUM].MEMBERS ON ROWS, FROM prodej_baget
SELECT Kompletní agregace FROM prodej_baget 29
Řez vrátíme se k jednoduchému modelu chceme vypsat tabulku s počtem prodaných kusů baget v jednotlivých dnech, ale pouze pro menzu Voršilská provedeme řez v rovině Voršilská
Datum Řez 31.10.2007 30.10.2007 cvalík golf Trója Voršilská Menza Bageta
Řez SELECT [DATUM].MEMBERS ON COLUMN, [BAGETA].MEMBERS ON ROWS FROM prodej_baget WHERE [MENZA].[Voršilská]
Řez 30.10.2007 31.10.2007 cvalík 5 4 golf 6 0
Řez řez mohu provést i ve více dimenzích za klauzulí WHERE napíši řezovou množinu mezi závorky ( ) provedeme řez (Voršilská, golf) SELECT [DATUM].MEMBERS ON COLUMN, FROM prodej_baget WHERE ([MENZA].[Voršilská], [Bageta].[Golf])
Datum Řez 31.10.2007 30.10.2007 cvalík golf Trója Voršilská Menza Bageta
Řez výsledek je jednodimenzionální, protože mám celkem 3 dimenze a ve dvou jsem provedl řez 30.10.2007 31.10.2007 6 0
Výrazy máme definováno více měr počet prodaných kusů (první míra) tržba za bagety náklady na nákup za bagety jsou v další hierarchické dimenzi MIRY chceme zjistit zisk zisk bude vypočítaná míra
Výrazy WITH MEMBER MIRY.ZISK AS 'MIRY.TZRBA MIRY.NAKLADY' SELECT [DATUM].MEMEBERS ON COLUMNS, [BAGETA].MEMBERS ON ROWS FROM Sales WHERE ( MIRY.ZISK )
Vícedimenzionální výsledek SELECT [DATUM].MEMEBERS ON AXIS(0), [BAGETA].MEMBERS ON AXIS(1), [MENZA].MEMBERS ON AXIS(2) FROM prodej_baget AXIS(2) = PAGES výsledek mohou být dvě tabulky, ne každý klient je umí zobrazit na obrazovce, budou pouze v reportu
Množiny pozic SELECT {[VYROBEK][NAPOJ].[PIVO], [VYROBEK].[BAGETA].MEMBERS } ON COLUMNS, [PRODEJNA].MEMBERS ON ROWS FROM prodej_baget