Data Scientist's Notes: Personalized Review of Data Query Languages
Hovorím vám z vlastnej skúsenosti, čo bolo užitočné, kde a kedy. Je to prehľad a téza, aby bolo jasné, v čom a kde sa dá hrabať ďalej - ale tu mám výlučne subjektívnu osobnú skúsenosť, možno je u vás všetko úplne inak.
Prečo je dôležité poznať a vedieť používať dopytovacie jazyky? Data Science má vo svojom jadre niekoľko dôležitých fáz práce a úplne prvou a najdôležitejšou (bez nej určite nič nebude fungovať!) je získavanie alebo extrahovanie údajov. Najčastejšie sú dáta niekde v nejakej forme a treba ich odtiaľ „získať“.
Dotazovacie jazyky vám umožňujú extrahovať práve tieto údaje! A dnes vám poviem o tých dopytovacích jazykoch, ktoré boli pre mňa užitočné, a poviem vám a ukážem vám, kde a ako presne - prečo je potrebné študovať.
Existujú tri hlavné bloky typov dotazov na údaje, o ktorých budeme diskutovať v tomto článku:
„Štandardné“ dopytovacie jazyky sú to, čo sa bežne chápe, keď hovoríme o jazyku dopytov, ako je relačná algebra alebo SQL.
Skriptovacie dopytovacie jazyky: napríklad, Python veci pandy, numpy alebo shell skriptovanie.
Dotazovacie jazyky pre znalostné grafy a databázy grafov.
Všetko, čo je tu napísané, je len osobná skúsenosť, čo bolo užitočné, s popisom situácií a „prečo to bolo potrebné“ - každý si môže vyskúšať, ako sa vám podobné situácie môžu vyskytnúť a pokúsiť sa na ne vopred pripraviť pochopením týchto jazykov predtým, než sa budete musieť (naliehavo) prihlásiť na projekt alebo sa dokonca dostať na projekt, kde sú potrebné.
„Štandardné“ jazyky dopytov
Štandardné dopytovacie jazyky sú presne v tom zmysle, že na ne zvyčajne myslíme, keď hovoríme o dopytoch.
Relačná algebra
Prečo je dnes potrebná relačná algebra? Aby ste dobre pochopili, prečo sú dopytovacie jazyky určitým spôsobom štruktúrované a vedome ich používať, musíte pochopiť jadro, na ktorom sú založené.
Čo je relačná algebra?
Formálna definícia je nasledovná: relačná algebra je uzavretý systém operácií s vzťahmi v relačnom dátovom modeli. Povedané trochu ľudskejšie, ide o systém operácií nad tabuľkami tak, že výsledkom je vždy tabuľka.
Pozrite si všetky relačné operácie v toto článok od Habra - tu popisujeme, prečo to potrebujete vedieť a kde sa to hodí.
Prečo?
Ak začnete chápať, o čom sú dopytovacie jazyky a aké operácie sú za výrazmi v konkrétnych dopytovacích jazykoch, často získate hlbšie pochopenie toho, čo a ako funguje v dopytovacích jazykoch.
Prevzaté z toto články. Príklad operácie: join, ktorá spája tabuľky.
Materiály na štúdium:
Dobrý úvodný kurz zo Stanfordu. Vo všeobecnosti existuje veľa materiálov o relačnej algebre a teórii - Coursera, Udacity. Na internete je tiež obrovské množstvo materiálu, vrátane dobrého akademické kurzy. Moja osobná rada: musíte veľmi dobre rozumieť relačnej algebre – to je základ základov.
SQL je v podstate implementácia relačnej algebry – s dôležitým upozornením je SQL deklaratívny! To znamená, že pri písaní dotazu v jazyku relačnej algebry v skutočnosti poviete, ako počítať - ale pri SQL určíte, čo chcete extrahovať, a potom už DBMS generuje (efektívne) výrazy v jazyku relačnej algebry (ich ekvivalencia je nám známa ako Coddova veta).
Relačné DBMS: Oracle, Postgres, SQL Server atď. sú stále prakticky všade a existuje neuveriteľne vysoká šanca, že s nimi budete musieť komunikovať, čo znamená, že budete musieť SQL čítať (čo je veľmi pravdepodobné) alebo ho písať ( ani nepravdepodobné).
Čo čítať a študovať
Podľa rovnakých odkazov vyššie (o relačnej algebre) existuje neskutočné množstvo materiálu, napr. toto.
Mimochodom, čo je NoSQL?
"Je potrebné ešte raz zdôrazniť, že pojem "NoSQL" má úplne spontánny pôvod a nemá za sebou žiadnu všeobecne akceptovanú definíciu alebo vedeckú inštitúciu." Zodpovedajúce článok na Habr.
V skutočnosti si ľudia uvedomili, že na vyriešenie mnohých problémov nie je potrebný úplný relačný model, najmä pre tie, kde je kritický napríklad výkon a dominujú určité jednoduché dotazy s agregáciou – kde je dôležité rýchlo vypočítať metriky a zapísať ich do databáza a väčšina funkcií je relačných sa ukázala ako nielen zbytočná, ale aj škodlivá – prečo niečo normalizovať, ak nám to pokazí to najdôležitejšie (pre nejakú konkrétnu úlohu) – produktivitu?
Okrem toho sú často potrebné flexibilné schémy namiesto pevných matematických schém klasického relačného modelu – a to neuveriteľne zjednodušuje vývoj aplikácií, keď je dôležité nasadiť systém a začať pracovať rýchlo, spracovať výsledky – alebo schému a typy uložených údajov. nie sú také dôležité.
Napríklad vytvárame expertný systém a chceme ukladať informácie o konkrétnej doméne spolu s niektorými meta informáciami – možno nepoznáme všetky polia a jednoducho ukladáme JSON pre každý záznam – to nám dáva veľmi flexibilné prostredie na rozširovanie údajov. model a rýchlo iteruje - tak v tomto V tomto prípade bude NoSQL ešte výhodnejšie a čitateľnejšie. Príklad záznamu (z jedného z mojich projektov, kde bol NoSQL presne tam, kde ho bolo treba).
Tu si skôr stačí dôkladne analyzovať svoju úlohu, aké vlastnosti má a aké NoSQL systémy sú dostupné, ktoré by tomuto popisu vyhovovali - a potom začať študovať tento systém.
Skriptovacie dopytovacie jazyky
Najprv sa zdá, čo s tým má Python vo všeobecnosti spoločné - je to programovací jazyk a vôbec nie o dotazoch.
Pandas je doslova švajčiarsky nôž Data Science, dochádza v ňom k veľkému množstvu transformácií dát, agregácií atď.
Numpy - vektorové výpočty, matice a lineárna algebra tam.
Scipy - v tomto balíku je veľa matematiky, najmä štatistiky.
Jupyter lab – množstvo prieskumných dátových analýz sa hodí do notebookov – užitočné vedieť.
Požiadavky - práca so sieťou.
Pyspark je medzi dátovými inžiniermi veľmi populárny, s najväčšou pravdepodobnosťou budete musieť komunikovať s týmto alebo Sparkom, jednoducho kvôli ich popularite.
*Selén – veľmi užitočný na zhromažďovanie údajov zo stránok a zdrojov, niekedy jednoducho neexistuje iný spôsob, ako údaje získať.
V podstate vidíme, že kód zapadá do klasického vzoru SQL.
SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, …..
FROM dataset
WHERE trip_type = ‘return’
GROUPBY start_station_name, end_station_name
Ale dôležité je, že tento kód je súčasťou skriptu a potrubia; v skutočnosti vkladáme dotazy do potrubia Pythonu. V tejto situácii k nám dopytovací jazyk prichádza z knižníc, ako sú Pandas alebo pySpark.
Vo všeobecnosti v pySpark vidíme podobný typ transformácie údajov prostredníctvom dopytovacieho jazyka v duchu:
O samotnom Pythone všeobecne žiadny problém nájsť materiály na štúdium. Na internete je obrovské množstvo návodov pandy, pySpark a kurzy na Iskra (a tiež sám od seba DS). Celkovo je tu obsah skvelý na googlovanie a ak by som si mal vybrať jeden balíček, na ktorý by som sa mal zamerať, boli by to samozrejme pandy. Čo sa týka kombinácie materiálov DS+Python veľmi veľa.
Shell ako dopytovací jazyk
Pomerne veľa projektov na spracovanie a analýzu údajov, s ktorými som pracoval, sú v skutočnosti skripty shellu, ktoré volajú kód v jazyku Python, Java a samotné príkazy shellu. Preto vo všeobecnosti môžete pipeline v bash/zsh/atď považovať za nejaký druh dotazu na vysokej úrovni (môžete tam samozrejme napchať slučky, ale to nie je typické pre kód DS v jazykoch shellu), dajme jednoduchý príklad - potreboval som urobiť QID mapovanie wikidát a úplné odkazy na ruskú a anglickú wiki, na to som napísal jednoduchú požiadavku z príkazov v bash a na výstup som napísal jednoduchý skript v Pythone, ktorý som dať dokopy takto:
JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")'
Toto bolo v skutočnosti celé potrubie, ktoré vytvorilo požadované mapovanie; ako vidíme, všetko fungovalo v režime streamu:
pv filepath - poskytuje indikátor priebehu na základe veľkosti súboru a odovzdáva jeho obsah ďalej
unpigz -c prečítal časť archívu a dal ju jq
jq s kľúčom - stream okamžite vytvoril výsledok a odovzdal ho postprocesoru (rovnako ako v prvom príklade) v Pythone
interne bol postprocesor jednoduchý stavový stroj, ktorý formátoval výstup
Celkovo ide o komplexný kanál pracujúci v režime toku na veľkých dátach (0.5 TB), bez významných zdrojov a vytvorený z jednoduchého potrubia a niekoľkých nástrojov.
Ďalší dôležitý tip: vedieť dobre a efektívne pracovať v termináli a písať bash/zsh/atď.
Kde to bude užitočné? Áno, takmer všade – opäť je na internete VEĽA materiálov na štúdium. Najmä tu toto môj predchádzajúci článok.
R skriptovanie
Čitateľ môže opäť zvolať – no, toto je celý programovací jazyk! A samozrejme, bude mať pravdu. S R som sa však zvyčajne stretol v takom kontexte, že v skutočnosti bol veľmi podobný dopytovaciemu jazyku.
R je štatistické výpočtové prostredie a jazyk pre statické výpočty a vizualizáciu (podľa tento).
Prečo potrebuje dátový vedec poznať R? Prinajmenšom preto, že existuje obrovská vrstva ľudí bez IT, ktorí analyzujú údaje v R. Narazil som na to na nasledujúcich miestach:
Farmaceutický sektor.
Biológovia.
Finančný sektor.
Ľudia s čisto matematickým vzdelaním, ktorí sa zaoberajú štatistikami.
Špecializované štatistické modely a modely strojového učenia (ktoré možno často nájsť iba v autorskej verzii ako balík R).
Prečo je to vlastne dopytovací jazyk? V podobe, v akej sa často nachádza, ide vlastne o požiadavku na vytvorenie modelu, vrátane čítania dát a opravy parametrov dotazu (modelu), ako aj vizualizácie údajov v balíkoch ako ggplot2 - aj to je forma zápisu dotazov .
Príklady dotazov na vizualizáciu
ggplot(data = beav,
aes(x = id, y = temp,
group = activ, color = activ)) +
geom_line() +
geom_point() +
scale_color_manual(values = c("red", "blue"))
Vo všeobecnosti sa veľa nápadov z R presunulo do balíkov python, ako sú pandas, numpy alebo scipy, ako sú dátové rámce a vektorizácia údajov - takže vo všeobecnosti sa vám veľa vecí v R bude zdať známych a pohodlných.
Tu mám trochu nezvyčajnú skúsenosť, pretože pomerne často musím pracovať so znalostnými grafmi a dopytovacími jazykmi pre grafy. Poďme si preto v krátkosti prejsť základy, keďže táto časť je trochu exotickejšia.
V klasických relačných databázach máme pevnú schému, ale tu je schéma flexibilná, každý predikát je vlastne „stĺpec“ a ešte viac.
Predstavte si, že ste modelovali osobu a chceli ste popísať kľúčové veci, napríklad, zoberme si konkrétnu osobu, Douglasa Adamsa, a tento popis použite ako základ.
Ak by sme použili relačnú databázu, museli by sme vytvoriť obrovskú tabuľku alebo tabuľky s veľkým počtom stĺpcov, z ktorých väčšina by bola NULL alebo vyplnená nejakou predvolenou hodnotou False, napríklad je nepravdepodobné, že mnohí z nás majú záznam v Kórejskej národnej knižnici – samozrejme, mohli by sme ich dať do samostatných tabuliek, ale to by bol v konečnom dôsledku pokus o modelovanie flexibilného logického obvodu s predikátmi pomocou pevného relačného.
Predstavte si teda, že všetky údaje sú uložené ako graf alebo ako binárne a unárne booleovské výrazy.
Kde sa s tým vôbec môžete stretnúť? Po prvé, práca s dátová wikia s akýmikoľvek databázami grafov alebo pripojenými údajmi.
Nasledujú hlavné dopytovacie jazyky, ktoré som používal a pracoval s nimi.
Ale v skutočnosti je to dopytovací jazyk pre logické unárne a binárne predikáty. Jednoducho podmienečne špecifikujete, čo je v booleovskom výraze pevné a čo nie (veľmi zjednodušené).
Samotná základňa RDF (Resource Description Framework), cez ktorú sa vykonávajú SPARQL dotazy, je trojitá object, predicate, subject - a dotaz vyberie požadované trojice podľa špecifikovaných obmedzení v duchu: nájdite X také, že p_55(X, q_33) je pravdivé - kde, samozrejme, p_55 je nejaký vzťah s ID 55 a q_33 je objekt s ID 33 (tu a celý príbeh, opäť s vynechaním najrôznejších detailov).
V skutočnosti chceme nájsť hodnotu premennej ?krajina takú, že pre predikát
member_of, platí, že member_of(?country,q458) a q458 je ID Európskej únie.
Príklad skutočného dotazu SPARQL vo vnútri python motora:
Typicky som musel SPARQL čítať a nie písať - v takejto situácii by bolo pravdepodobne užitočnou zručnosťou rozumieť jazyku aspoň na základnej úrovni, aby som presne pochopil, ako sa získavajú údaje.
Existuje veľa materiálu na štúdium online: napríklad tu toto и toto. Zvyčajne si googlim konkrétne návrhy a príklady a to mi zatiaľ stačí.
Logické dopytovacie jazyky
Viac o téme si môžete prečítať v mojom článku tu. A tu len stručne preskúmame, prečo sú logické jazyky vhodné na písanie dotazov. RDF je v podstate len súbor logických príkazov vo forme p(X) a h(X,Y) a logický dotaz má nasledujúci tvar:
output(X) :- country(X), member_of(X,“EU”).
Tu hovoríme o vytvorení nového predikátového výstupu/1 (/1 znamená jednočlenný), za predpokladu, že pre X platí, že country(X) - teda X je krajina a zároveň člen(X,"EU ").
To znamená, že v tomto prípade sú údaje aj pravidlá prezentované rovnakým spôsobom, čo umožňuje veľmi jednoducho a dobre modelovať problémy.
Kde ste sa stretli v brandži?: celý veľký projekt s firmou, ktorá v takomto jazyku píše dopyty, aj na aktuálny projekt v jadre systému - zdalo by sa, že ide o dosť exotickú vec, ale občas sa to stáva.
Príklad fragmentu kódu v logickom jazyku spracovávajúcom wikiúdaje:
Materiály: Dám sem pár odkazov na moderný logický programovací jazyk Answer Set Programming - odporúčam si ho preštudovať: