---
# System prepended metadata

title: 09 Spracovanie dát

---

# 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