# 9. Spracovanie dát
Základní pojmy a principy datových skladů, datové analytiky a business intelligence. Životní cyklus datového skladu. Analytika velkých dat, jazyky pro realizaci analytický úloh, analytika na úrovni databází. Pokročilé techniky zpracování dat, výkonnostní aspekty zpracování velkých dat. Příklady z praxe pro vše výše uvedené. (PA036, PA220, PA212)
---
## Základné pojmy a princípy dátových skladov, dátové analytiky a business intelligence
**Business intelligence (BI)** je proces analyzovania dát a prezentovania výsledkov (pomocou tabuliek, grafov) pre manažérov vo firme, ktorí využívajú tieto dáta na riadenie procesov.
- Príklad: dáta o predajoch na pobočkách sa analyzujú a pobočky s nízkym obratom sa zrušia, nakoľko sú stratové
BI sa zároveň dá chápať aj ako **sada nástrojov a aplikácií** pre:
- Zber dát
- Nachystanie dát pre uloženie a analýzu
- Vytvorenie a vykonávanie dotazov
- Vytvorenie reportov a dashboards
- Vizualizáciu dát
**Kľúčové problémy**
- Príliš komplexné a nepoužiteľné modely
- Duplikácia dát v rôznych systémoch
- Dáta sú určené na operatívne systémy (účtovníctvo)
- Zlá kvalita údajov****
- Dáta sú premenlivé
**Business Analyst** je človek, ktorý využíva dátový sklad na prehľadávanie informácií.
- Využíva ich na rozhodovanie -> **Decision Support System (DSS)**
- Model musí byť **ľahko zrozumiteľný**
- Dizajn je ovplyvňovaný najmä **dátami, nie aplikáciami**
**Enterprise Data Warehouse** može byť typu:
- OLTP - Online Transaction Processing
- Riadi sa ACID princípmi
- OLAP - Online Analytical Processing
- MOLAP (Multidimensional OLAP)
- ROLAP (Relational OLAP)
- HOLAP (Hybrid OLAP)
**Dátový sklad** (Data Warehouse - DW) je OLAP databáza, ktorá funguje ako centrálny zdroj pravdy pre analýzu a reporting. Dáta v sklade sa nemenia, iba sa k nim pridávajú nové údaje. Zvyčajne obsahuje historické, auditovateľné dáta.
- **OLAP** - jedná sa o databáze pre veľké množstvo analytických dát, nie na transakčné spracovanie
- Zamykanie objektov (riadkov, stĺpcov, tabuliek) nie je v takejto DB potrebné
- Často sa jedná o stĺpcové databázy (**columnar**), optimalizované na selekciu stĺpcov
- Dáta môžu byť denormalizované, NoSQL
- Používame princíp **ETL - Extract, Transform, Load**
- Dáta sa najprv získajú z nejakých neštruktúrovaných dát, potom sa očistia, transformujú sa do stĺpcov a pridajú do datového skladu
- Schémy sú zvyčajne hviezdicové (**star schema**) - máme tzv. **faktové tabuľky** a **tabuľky dimenzií**
- **Fakt** - analytická udalosť, obsahuje čísla, výpočty, hodnoty, ktoré nás analyticky zaujímajú
- **Dimenzia** - v podstate číselník, ktorý sa referencuje vo faktoch pomocou cudzích kľúčov (Time, Person, Store, Product...)
- **Snowflake schéma je antipattern**, dimenzie nemôžu referencovať iné poddimenzie
- Na OLAP sa dá používať RDBMS ako Postgres alebo špecifikované DB (Google BigQuery, Teradata)
**Vlastnosti** DW:
- **Subject-oriented** - týka sa iba jednej udalosti/entity
- **Integrated** - homogenizácia údajov, problém s NULLom
- **Non-volatile** - dáta sa po nahraní nemenia/nevymažú
- **Time-varying** - zmeny sú zaznamenávané, robia sa snapshoty
**Požiadavky** na DW:
- Informácie musia byť jednoducho prístupné
- Informácie musia byť konzistentné
- Informácie sa musia zobrazovať včas
- Informácie musia byť bezpečné
- Databáza musí byť prispôsobená na zmeny
- Používatelia ju musia akceptovať
**Data mart** je menší dátový sklad, ktorý obsahuje zlomkové údaje dané pre špecifické použitie napr. OLAP, Data Mining, Visualization.
**Alternatívne architektúry DW**:
- Samostatné data marts
- Veľa menších databáz
- Nie je jednoznačný zdroj pravdy
- Logické data marts - odporúčané
Typy **faktových tabuliek**:
- **Transaction** (Event) - faktami sú business event napr. predaj, typicky je možné na nich robiť súčty
- **Snapshot** - obsahuje fakty pre každú kombináciu dimezií v nejakom časovom rámci
- Cumulative snapshot - fakt pre každú kombináciu dimenzií v danom časovom rámci, od začiatku až po koniec procesu
- Fact-less - fakt pre jednu udalosť napr. stret so zákazníkom, je iba kombináciou dimenzií, neobsahuje measures
- Aggregate - agreguje niektoré záznamy do jedného
- Consolidated - fakty rovnakej granularity skombinované do jedného napr. predaje skombinované s predpoveďou predaja
Udalosti, ich fakty a dimenzie vieme určiť pomocou **techniky 7W**:
- Who, What, How much (fact), When, Where, Why, How
- Výber faktov závisí na zvolenej granularite
## Životný cyklus dátového skladu
Datový sklad vieme **vybudovať** dvoma spôsobmi:
- **Top-down** approach - tvoríme najprv celý DW a potom DMs
- **Bottom-up** approach
- Tvoríme najprv malé data marts a postupne sa dostávame vyššie
- Veľké výsledky v krátkom čase na rozdiel od Top-down
- Nevyžaduje vysoké náklady
**Životný cyklus** DW má nasledujúce **fázy**:
- Určenie cieľa a plánovanie
- Čo od systému očakávame, aký má byť rozsah dát, odhad ceny, rizík, prioritizácia subjektov (data marts)
- Návrh infraštruktúry
- Voľba vhodných nástrojov a technológií, architektonických riešení
- Návrh a vývoj data marts
- Voľba procesu
- Určenie granularity
- Identifikácia dimenzií
- Identifikácia faktov
- Čistenie dát a ich pridávanie do DW systému
- **ETL (Extract Transform Load)**
- **Extract**
- Získanie dát zo zdrojových databáz
- **Transform**
- Odstránienie duplicít
- Úprava dát aby sa dali vložiť do faktov a dimenzií
- Vyčistiť od nekompletných dát alebo dát s chybami (gramatické chyby, nekonzistencie, NULLs)
- Niekedy je nutné rozdeliť dáta do viacero stĺpcov (napr. meno na krstné a priezvisko)
- Je možné čiastočne automatizovať, ale často je nutné to robiť manuálne
- Zvyčajne máme viacero prostredí, najprv sa dáta vkladajú do Staging DB a potom do Production DB
- Je vhodné robiť ETL proces po menších častiach
- **Load**
- Najprv aktualizujeme dimenzie, aby sme mali prístup k cudzím kľúčom
- Potom pridáme fakty
- Je vhodné vypnúť integritné obmedzenia a po vložení ich zapnúť
- Je vhodné napĺňať po veľkých častiach
- Je možné využiť paralelizáciu
- Rozširovanie a údržba
Proces ETL sa môže vykonávať dvoma spôsobmi:
- **Query-Driven Data Integration**
- Dáta sa integrujú na požiadavku (lazy)
- Nepoužíva sa
- **Warehouse-Driven Data Integration**
- Eager loading - dáta sa nahrávajú vopred
- Dáta sa už nachádzajú v DW pre querying a analýzu
- Výhody - veľmi rýchle
- Nevýhody - duplikácia údajov, nemáme najčerstvejšie dáta
- Používa sa v praxi
**Hodnoty dimenzií** sa môžu počas života DW **zmeniť**.
- Príklad: pobočka obchodu sa presunie pod iný región - nastala zmena v dimenzii Region
- Potrebujeme zabezpečiť, akým spôsobom sa má táto zmena historicky vyhodnotiť
- Definujeme typy **SCD - Slowly Changing Dimension**
- SCD 0 - ignorujeme zmenu, nezaujíma nás ako sa to volá teraz
- SCD 1 - prepíšeme zmenu, nezaujíma nás ako sa to volalo predtým
- SCD 2 - pridáme nový riadok so zmenenou hodnotou, ale zachováme aj pôvodný (iba nový surrogate key)
- SCD 3 - pridáme nový stĺpec (málokedy použijeme)
- SCD 4 - pre časté zmeny použijeme tabuľku histórie (mini-dimenziu)
- SCD 5 - kombinácia SCD 4+1
- SCD 6 - kombinácia SCD 1+2+3
- SCD 7 - dve dimenzie typu SCD 1+2
**Data Cleaning** je proces, ktorý robíme počas kroku **Transform**:
- Dáta z rôznych zdrojov môžu mať rozny formát, naším cieľom je ich formát normalizovať - napr. Gender M/F, male/female, 0/1
- Využívame techniky similarity join, clustering, parsing
- Musíme sa rozhodnúť, ako klasifikovať nulové hodnoty "null values" - zvyčajne ich nechceme stratiť a nahradíme ich za nejaký znak, napr "N/A"
## Analytika veľkých dát (Big Data), jazyky pre realizáciu analytických úloh, analytika na úrovni databáz
Pojem **Big Data** definuje **analytické dáta**, ktoré kvôli svojej **rýchlej** a **kontinuálnej** tvorbe, **veľkému objemu**, či **zložitosti** vyľučujú tradičné spôsoby analytického spracovania.
Veľké dáta majú nasledujúce **vlastnosti**:
- Volume - veľkosť dát sa exponenciálne zvyšuje
- Velocity - dáta tečú rýchlo (z realtime zdrojov)
- Variety - rôzna štruktúra dát
- Veracity - pôvod dát, jednoznačnosť a pravdivosť (vieme jednoznačne určiť, odkiaľ pochádzajú)
- Value - sú dáta pre mňa hodnotné? majú pre mňa nejaký zmysel?
- Real-time processing - dáta sa spracujú v reálnom čase
Na **spracovanie** veľkých dát používame **distribuované DW**, ktoré pracujú na princípe **horizontálneho škálovania**.
- Stĺpcové (Cstore)
- HDFS, MapReduce (Hadoop)
- SW knižnica pre distribuované spracovávanie veľkých datasetov
- Apache Hive - poskytuje DML (UPDATE, DELETE, INDEX), syntax podobná SQL
- Apache Impala - podobné Hive ale má nízku odozvu
- Apache Kylin - používa Hive, ľahko sa integruje do Power BI
- NoSQL (HBase)
- In-Memory (VoltDB)
**MapReduce** je algoritmus, pomocou ktorého najprv prevedieme zoznam dát do key-value párov a potom nad jednotlivými skupinami vykonávame **agregačnú** funkciu. Výhodou je paralelné spracovanie na rôznych výpočetných jednotkách distribuovaného systému. Používa sa pri **batch processingu**.
Na **realizáciu analytických úloh** zvyčajne používame jazyk typu SQL, MapReduce algoritmy alebo špecifické DML jazyky NoSQL databáz (HiveQL). Prípadne môžeme používať **procedurálne jazyky**, ako napríklad PL/pgSQL (Postgres) alebo T-SQL (MSSQL).
V prípade, ak potrebujeme zabezpečiť analytiku dát v reálnom čase, použijeme metódy **stream processingu**.
- Príklad: Apache Storm, Apache Samza
- Zvyčajne sa jedná o vyhodnocovanie nad grafovými štruktúrami
Na **vyhodnocovanie dotazov** nad veľkými dátami využívame **multidimenzionálny model**. **Cieľom** OLAP systému je **multidimenzionálna analýza**. Kocky by mali byť organizované tak, aby boli odpovede na dotazy čo najrýchlejšie.
- Model kocky (cube)
- Skladá sa z buniek
- Typicky majú 4 až 12 dimenzií (hyperkocka)
- Sparse cube = obsahuje málo prázdnych buniek
- Dense cube = obsahuje veľa prázdnych buniek
- Pri vyšších dimenzíach sú viac "sparse"
**Relational OLAP (ROLAP)** využíva klasické relačné databáze (RDBMS), pričom používa hviezdicovú topológiu schémy a SQL dotazovací jazyk.
- Výhody - škáluje, flexibilita
- Nevýhody - veľkosť na disku, pomalšie odpovede na dotazy
- Typy dotazov
- Navigačný dotaz - získa iba jednu dimenziu
- Agregačný dotaz - sumarizuje dáta faktov
**Multidimensional OLAP (MOLAP)** využíva miesto relačných schém multidimenzionálne matice.
- Výhody - rýchle, zaberá menej miesta na disku
- Nevýhody - menej flexibilné, menej otvorený systém
- Implementácie
- MSSQL SSAS
- Oracle OLAP
**Hybrid OLAP (HOLAP)** je kombináciou ROLAP a MOLAP.
- Dáta sú uložené v relačných DB
- Agregácie sú uložené v multidimenzionálnych štruktúrach
- Výhody - škáluje, rýchle
- Nevýhody - zložité
Nad dátami tvoríme dotazy skrz **OLAP operácie**.
- Typické operácie
- Roll up - agregácia naprieč dimenziou (počet produktov v čase pre každú pobočku)
- Drill down - opak agregácie, hlbšia granularita (počet produktov pre každú pobočku za deň)
- Slice and dice - výber konkrétnej hodnoty dimenzie (počet produktov pre každú pobočku v roku 2000)
- Pivot - tvorba kontingenčnej tabuľky s danými kombináciami dimenzií
- Ďalšie operácie
- Aggregate functions
- Ranking and comparing
- Drill across
- Drill through
- Data densification
**Pivoting v ROLAP systéme** slúži na reprezentáciu agregácie prostredníctvom **kontingenčnej tabuľky**.
- Využitie hodnoty ALL (dummy hodnota)
- SQL `GROUP BY` je nedostačujúce pre veľké množstvo Big Data dimenzií (museli by sme použiť `UNION`)
- Používame špeficiké, nové keywords
**Grouping sets**
```sql
SELECT dept_name, job_title, COUNT(*) FROM Personnel GROUP BY GROUPING SET (dept_name, job_title);
```
**Rollup**
```sql
SELECT year, brand, SUM(qty) FROM sales GROUP BY ROLLUP (year, brand);
```
**Cube**
```sql
SELECT year, brand, SUM(qty) FROM sales GROUP BY CUBE (year, brand);
```
**Window functions**
- OVER
```sql
SELECT ... AVG(sales) OVER (PARTITION BY region ORDER BY month ASC ROWS 2 PRECEDING) AS SMA3, ... FROM ...
```
- FIRST_VALUE, LAST_VALUE, NTH_VALUE
```sql
SELECT ... FIRST_VALUE(sales) OVER (PARTITION BY channel ORDER BY sales) AS lowest_sales
```
- LAG, LEAD
```sql
SELECT ... LAG(sales, 1) OVER (PARTITION BY channel ORDER BY calendar) AS prev_sales
```
**Ranking**
- ROW_NUMBER
```sql
SELECT SalesOrderID, CustomerID, ROW_NUMBER() OVER (ORDER BY SalesOrderID) as RunningCountFROM Sales WHERE SalesOrderID > 10000 ORDER BY SalesOrderID
```
- RANK OVER, DENSE RANK OVER
```sql
SELECT channel, calendar, TO_CHAR(TRUNC(SUM(amount_sold), -6), '9,999,999') AS sales, RANK() OVER (ORDER BY TRUNC(amount_sold, -6)) DESC) AS rank, DENSE_RANK() OVER (ORDER BY TRUNC(SUM(amount_sold), -6)) DESC) AS dense_rankFROM sales, products
SELECT ... RANK() OVER (PARTITION BY channel ORDER BY SUM(amount_sold) DESC) AS rank_by_channel
```
- NTILE
```sql
SELECT ... NTILE(3) OVER (ORDER BY sales) NT_3 FROM ...
```
## Pokročilé techniky spracovávania dát, výkonnostné aspekty spracovania veľkých dát
Pre zaistenie rýchlosti sa v OLAP systémoch používa **redundancia** pomocou:
- Materializovaných pohľadov
- Indexov
- Denormalizovaného schéma
Ak sú naše dáta príliš veľké, môžeme ich rozdeliť pomocou **partitioningu**:
- Horizontal - rozdelenie riadkov do viacerých tabuliek
- Vertical - rozdelenie dát po stĺpcoch na viacero tabuliek
- Zvyčajne používame "view" na spájanie a prácu nad nimi
- Výhoda - parallel processing, security, recovery, partitions stored on different disks, each partition can be optimized for performance
- Nevýhoda - slow retrieval across partitions, complexity
Na zabezpečenie **rýchlosti** vo vyhľadávacích dotazoch chceme maximalizovať využitie **indexov**.
- Snažíme sa minimalizovať počet **sekvenčne skenovaných** riadkov (sequential scan)
**Typy** indexov:
- Hash
- B+ Tree - klasický samo-vyvažovací strom používaný v RDBMS, nepoužiteľné na multidimenzionálne dáta
- UB Tree - linearizuje multidimenzionálne dáta pomocou Z-curve
- R Tree - multidimenzionálny index, ale zle škáluje
- R+ Tree
- R* Tree
- X Tree
- **Bitmap Index**
- Tento index je vhodný pre dáta s malým množstvom možných hodnôt (napr. pohlavie, veľkosť oblečenia)
- Má podobný performance ako B+ strom pre read-only data
- Bitmapový index spočíva v kolekcii bitmáp (bitových vektorov), pričom tento vektor obsahuje kombináciu hodnôt 1 a 0 podľa toho, či je daný záznam s tabuľkou prepojený alebo nie
- Veľkost bitmapy závisí na počte záznamov
- Jednoduchá kombinácia AND/OR viacerých bitových máp
- **Range Encoded Bitmap Index**
- Používa sa pre dotazy typu od - do
- Idea: bit je nastavený vo všetkých vektoroch až po určitú hodnotu
- Vyžaduje usporiadanie dát
- Je efektívnejšie riešenie, nakoľko ide o prístup typu: NOT previous AND current
- Čiže nám stačí prečítať iba 2 bitové mapy
- Nevýhoda: priamy prístup vyžaduje tiež 2 čítania
- Príklad: Osoby narodené medzi 3. a 8. mesiacom (vrátane)
- (NOT A1) AND A7
**Bitmapové indexy** by sa mali používať iba ak je **malá selektivita** tj. málo typov možných hodnôt.
- Riadime sa pravidlom max. 1% kardinality
- Príklad: máme tabuľku A s 1,000,000 riadkami a tabuľku B s 10,000 riadkami - kardinalita 1% => oplatí sa použiť bitmapový index miesto B+
Je tiež dôležité **optimalizovať poradie JOIN a WHERE operácií**, práve kvôli kardinalite vzťahov medzi nimi.
- Príklad: je rozdiel, ak spravíme `JOIN (1,000,000 * 10,000)` a potom z toho robíme `WHERE`, než keď spravíme `(WHERE 1,000,000 => 1000) JOIN 10,000`
- Využívame tabuľky dimenzií na to, aby sme náš dotaz čo najviac špecifikovali
- Tabuľky dimenzií môžeme spojiť pomocou `CROSS JOIN` a potom v nich filtrovať
Vo všeobecnosti by sme mali preferovať `CROSS JOIN` **medzi dimenziami** ak ich cudzie kľúče nie sú všetky indexované, a ak sú, tak by sme mali použiť **prienik ich semi-joinov**. Nemali by sme preferovať plány generované RDBMS, nakoľko nie sú optimalizované na OLAP.
Ďaľšou technikou na zvýšenie rýchlosti je použitie **materializovaných pohľadov** (materialized views). Vieme ich pripraviť staticky alebo dynamicky. Musíme taktiež zvoliť, kedy má dochádzať k ich aktualizácii.
- **Staticky** - administrátor musí zvoliť, aké pohľady nám vylepšia rýchlosť dotazov
- **Dynamicky** - robí sa monitoring dotazov a optimalizácia podľa nich