Duomenų šaltiniai

SQL

Tarkime turime PostgreSQL duomenų bazę, kurioje yra dvi lentelės:

SALIS

ID

KODAS

PAVAD

100

lt

Lietuva

101

lv

Latvija

102

ee

Estija

MIESTAS

ID

SALIS_ID

PAVAD

204

100

Vilnius

205

100

Kaunas

206

100

Klaipėda

207

101

Ryga

208

102

Talinas

Tarkime, kad mes norime atverti tik Lietuvos duomenis, ignoruojant kitų šalių duomenis.

Duomenų aprašas atrodys taip:

id

d

r

b

m

property

type

ref

source

prepare

access

datasets/example/sql

db

sql

postgresql://user@host/dbname

country

id

SALIS

code="lt"

id

integer

ID

private

code

string

KODAS

open

name

string

PAVAD

open

city

id

MIESTAS

country.code="lt"

id

integer

ID

private

country

ref

country

SALIS_ID

open

name

string

PAVAD

open

Reliacinės duomenų bazės (RDBVS) yra populiariausias duomenų saugojimo būdas. Tačiau taip pat RDBVS struktūra yra lengviausiai aprašoma, didelė dalis metaduomenų saugoma pačioje RDBVS, todėl nesunkiai galima generuoti gan išsamias DSA lenteles automatiškai.

Atkreipkite dėmesį, kad id savybės pažymėtos private prieigos žyme. Taip rekomenduojama daryti tam, kad nebūtų atskleisti vidiniai duomenų bazės identifikatoriai. Dažniausiai tokie identifikatoriai yra naudingi tik duomenų bazės viduje ir išorėje neturi naudos. Be to, tam tikromis situacijomis, pasinaudojant vidiniais identifikatoriais galima atskleisti konfidencialius duomenis.

Kadangi išsikėlėme reikalavimą atverti tik Lietuvos duomenis, model.prepare stulpelyje nurodėme atveriamų duomenų filtrus. Dažniausiai tokie filtrai naudojami asmens duomenų filtravimui arba skaidant lenteles į kelis atskirus medelius.

Atlikus visas DSA lentelėje aprašytas transformacijas gausime tokias duomenų lenteles:

datasets/example/sql/country

_id

code

name

1

lt

Lietuva

2

lv

Latvija

3

ee

Estija

datasets/example/sql/city

_id

country

name

3

1

Vilnius

4

1

Kaunas

5

1

Klaipėda

Taip pat skaitykite: Duomenų atranka, SQL.

CSV

Tarkime turime tokius duomenis CSV formatu. CSV failuose reikšmės atskirtos ne įprastiniu , simboliu, o ; simboliu.

https://example.com/salys.csv

ID

KODAS

PAVADINIMAS

100

lt

Lietuva

101

lv

Latvija

102

ee

Estija

https://example.com/miestai.csv

ID

ŠALIS

PAVADINIMAS

204

100

Vilnius

205

100

Kaunas

206

100

Klaipėda

207

101

Ryga

208

102

Talinas

Duomenų aprašas atrodys taip:

id

d

r

b

m

property

type

ref

source

prepare

access

1

datasets/example/csv

2

salys

csv

https://example.com/{}.csv

tabular(sep: ";")

3

Country

id

salys

code="lt"

4

id

integer

ID

private

5

code

string

KODAS

open

6

name

string

PAVADINIMAS

open

7

City

id

miestai

country.code="lt"

8

id

integer

ID

private

9

country

ref

Country

ŠALIS

open

10

name

string

PAVADINIMAS

open

CSV duomenų resursas, pavadinimu salys nurodo iš kur skaityti duomenis ir kokiu formatu. Nurodant adresą iki CSV failo https://example.com/{}.csv naudojama vietos žymė {}, kuri pakeičiama modelio šaltinio pavadinimu, kuris nurodytas model.source stulpelyje.

Prieš skaitant duomenis, tabular.sep() nurodo, kad CSV faile naudojamas nestandartinis reikšmių skirtukas, kabliataškis.

Visa kita aprašoma lygiai taip pat, kaip ir SQL atveju.

ZIP

Tais atvejais, kai duomenys pateikiami failais, o failai pateikiami tam tikruose failų konteineriuose, pavyzdžiui ZIP archyvuose, tuomet aprašomi du skirtingi šaltiniai, kurie yra susiję vienas su kitu.

Pavyzdžiui turint analogišką pavyzdį, kaip ir su CSV failais, tik jei CSV failai būtų patalpinti ZIP archyve, duomenų struktūros aprašas atrodytų taip:

d

r

b

m

property

type

ref

source

datasets/example/zip

archyvas

zip

https://example.com/data.zip

salys

csv

archyvas

{}.csv

Country

id

salys

id

integer

ID

code

string

KODAS

name

string

PAVADINIMAS

Šiame pavyzdyje matome, kad atsirado naujas resursas pavadinimu archyvas rodantis į ZIP archyvo failą. Tuo tarpu CSV resursas pavadinimu salys, resource.ref stulpelyje, rodo, kad CSV failai yra archyvas resurso sudėtyje.

JSON

Tarkime JSON atveju turime API kuris atrodo taip:

https://example.com/salys/
{
   "šalys": [
      {"id": 100, "kodas": "lt", "šalis": "Lietuva"},
      {"id": 101, "kodas": "lv", "šalis": "Latvija"},
      {"id": 102, "kodas": "ee", "šalis": "Estija"}
   ]
}
https://example.com/miestai/lt
{
   "miestai": [
      {"id": 204, "miestas": "Vilnius"},
      {"id": 205, "miestas": "Kaunas"},
      {"id": 206, "miestas": "Klaipėda"}
   ]
}
https://example.com/miestai/lv
{
   "miestai": [
      {"id": 207, "miestas": "Ryga"}
   ]
}
https://example.com/miestai/ee
{
   "miestai": [
      {"id": 208, "miestas": "Talinas"}
   ]
}

Tokio API duomenų struktūrą galima aprašyti sekančios DSA lentelės pagalba:

id

d

r

b

m

property

type

ref

source

prepare

access

1

datasets/example/json

2

api

json

https://example.com/{}/

3

salys

json

api

salys

4

Country

id

šalys

5

id

integer

id

private

6

code

string

kodas

open

7

name

string

šalis

open

8

miestai

json

miestai/{country.code}

9

param

country

Country

select()

10

City

id

miestai

11

id

integer

id

private

12

country

ref

Country

param("country").id

open

13

name

string

miestas

open

Šį kartą turime reikalą su dinaminiu API, kuris neleidžia gauti visų miestų vienos užklausos pagalba. Norint gauti visus miestus, pirmiausia gauti visų šalių kodus, o tada turint šalies kodą, galima gauti tos šalies miestų duomenis.

Kad užduotis nebūtų per daug lengva, šį kartą aprašome visų šalių duomenis, ne tik Lietuvos.

model.source stulpelyje nurodyti JSON atributų pavadinimai, iš kurių skaitomi duomenys.

8-oje eilutėje, miestai resource kontekste įtrauktas Parametrai pavadinimu country, kuris generuoja parametrus, skaitant duomenis iš 3-ioje eilutėje aprašyto Country modelio. Tokiu būdu gauname visų šalių sąrašą ir 7-oje eilutėje resource.source galime nurodyti URI su šalies kodu, gautu iš country Parametrai.

11-oje eilutėje, country reikšmę gauname iš country parametro, kadangi miesto duomenyse, nei miesto kodo, nei id nėra.

Galiausiai gauname tokius duomenis:

datasets/example/json/country

_id

code

name

1

lt

Lietuva

2

lv

Latvija

3

ee

Estija

datasets/example/json/city

_id

country

name

3

1

Vilnius

4

1

Kaunas

5

1

Klaipėda

6

2

Ryga

7

3

Talinas

XML

Tarkime turime XML failą, kuris pasiekiamas adresu https://example.com/countries.xml, failo turinys yra toks:

<root>
    <country id="100" code="lt" name="Lietuva">
        <city id="204" name="Vilnius" />
        <city id="205" name="Kaunas" />
        <city id="206" name="Klaipėda" />
    </country>
    <country id="101" code="lv" name="Latvija">
        <city id="207" name="Ryga" />
    </country>
    <country id="102" code="ee" name="Estija">
        <city id="208" name="Talinas" />
    </country>
</root>

Šio XML failo DSA atrodys taip:

id

d

r

b

m

property

type

ref

source

prepare

access

1

datasets/example/xml

2

api

xml

https://example.com/{}.xml

3

countries

xml

api

countries

4

country

id

/root/country

5

id

integer

@id

private

6

code

string

@code

open

7

name

string

@name

open

8

city

id

/root/country/city

9

id

integer

@id

private

10

country

ref

country

parent::country/@id

open

11

name

string

@name

open

Šiuo atveju, visi duomenys pateikti viename XML faile, todėl aprašomas tik vienas resource. model.source ir property.source stulpelyje pateikiamas XPath reikšmė, kuri, jei prepare neužpildytas, vykdoma su xml.xpath() funkcija.

Galutiniame rezultate gauname tokius duomenis:

datasets/example/xml/country

_id

code

name

1

lt

Lietuva

2

lv

Latvija

3

ee

Estija

datasets/example/xml/city

_id

country

name

3

1

Vilnius

4

1

Kaunas

5

1

Klaipėda

6

2

Ryga

7

3

Talinas

XLSX

Tarkime yra XLSX failas, patalpintas adresu https://example.com/SALYS.XLSX, kuriame yra tokios dvi lentelės:

ŠALYS

KODAS

PAVADINIMAS

lt

Lietuva

lv

Latvija

ee

Estija

MIESTAI

ŠALIS

PAVADINIMAS

lt

Vilnius

lt

Kaunas

lt

Klaipėda

lv

Ryga

ee

Talinas

Duomenų aprašas atrodys taip:

id

d

r

b

m

property

type

ref

source

prepare

access

datasets/example/sql

lentele

xlsx

https://example.com/SALYS.XLSX

country

code

ŠALYS

code

string

KODAS

open

name

string

PAVADINIMAS

open

city

id

MIESTAI

id

array

country, name

private

country

ref

country

ŠALIS

open

name

string

PAVADINIMAS

open

Šiuo atveju, turime problemą, kad lentelėje nėra pateikti aiškūs identifikatoriai. Šalių atveju, kaip identifikatorių galima naudoti KODAS stulpelį, tačiau miestų atveju, darant prielaidą, kad skirtingose šalyse gali būti miestai tokiais pačiai pavadinimais, pirminį raktą formuojame iš šalies kodo ir miesto pavadinimo, tam įtraukiame naują id stulpelį, kuris kuriamas iš country ir name reikšmių.

Galutiniame rezultate gauname tokius duomenis.

datasets/example/xml/country

_id

code

name

1

lt

Lietuva

2

lv

Latvija

3

ee

Estija

datasets/example/xml/city

_id

country

name

3

1

Vilnius

4

1

Kaunas

5

1

Klaipėda

6

2

Ryga

7

3

Talinas

Spinta

Paskutinis pavyzdys atliekant transformaciją tos pačios duomenų saugyklos viduje. Visi duomenys aukščiau aprašytuose pavyzdžiuose bus apjungiami ir perkelti į standartų vardų erdvę. Tokiu būdu, turėsime vieną aiškią duomenų struktūrą, visiems iki šilo aprašytiems duomenų šaltiniams.

Tokia transformacijų DSA atrodo taip:

d

r

b

m

property

type

ref

source

geo

ns

Country

code

string

name

string

City

country

ref

Country

name

string

transformations/geo

data

spinta

https://example.com/

/geo/Country

proxy

code

Country

/datasets/example/{source}

param

source

sql

csv

json

xml

xlsx

code

string

code

name

string

name

/geo/City

proxy

country, name

City

country

ref

Country

country

name

string

name

Pirmiausiai apibrėžiame geo standarto duomenų struktūrą, toliau nurodome duomenų šaltinį spinta, kurio resource.source sutampa su saugyklos adresu.

source parametrui priskiriame sąrašą visų iki šiol aprašytų duomenų rinkinių ir šio parametro pagalba skaitome visų šaltinių duomenis ir base.type proxy pagalba siunčiame visus juos į geo vardų erdvę.

base.ref stulpelyje nurodome, kaip bus identifikuojami objektai, kad neatsirastu dublikatų.

Galutiniame rezultate, gausime tokius duomenis:

geo/country

_id

code

name

1

lt

Lietuva

2

lv

Latvija

3

ee

Estija

geo/city

_id

country

name

3

1

Vilnius

4

1

Kaunas

5

1

Klaipėda

6

2

Ryga

7

3

Talinas