Bazy NoSQL WB@NOSQL

Laboratorium

[Tao]

After three days without programming, life becomes meaningless.

The Tao of Programming 2.1

Narzędzia przydatne w trakcie EDA:

GitHub:

Learn X in Y minutes:

Różne rzeczy:

[John Tukey]

Exploratory Data Analysis (EDA) is an attitude, a state of flexibility, a willingness to look for those things that we believe are not there, as well as those we believe to be there.

John Tukey

Co powinny zawierać pliki z rozwiązaniami:

W repozytorium należy umieścić też skrypty wykorzystane w obliczeniach.

Zadanie GEO

Wyszukać w sieci dane zawierające obiekty GeoJSON. Następnie zapisać je w bazach Elasticsearch i PostgreSQL. Dla zapisanych danych napisać kilka geospatial queries w Elasticsearch i PostgreSQL, dla różnych obiektów Geo, np. Point, LineString i Polygon itd.

Przykład, ale dla bazy MongoDB, pokazujący o co chodzi w tym zadaniu.

Poniższe obiekty Point zapisujemy w pliku places.json:

places.json
{"_id": "oakland",  loc: {"type": "Point", "coordinates": [-122.270833,37.804444]}}
{"_id": "augsburg", loc: {"type": "Point", "coordinates": [10.898333,48.371667]}}
{"_id": "namibia",  loc: {"type": "Point", "coordinates": [17.15,-22.566667]}}
{"_id": "australia",loc: {"type": "Point", "coordinates": [135,-25]}}}
{"_id": "brasilia", loc: {"type": "Point", "coordinates": [-52.95,-10.65]}}

Importujemy je do kolekcji places w bazie test:

mongoimport -c places < places.json

Logujemy się do bazy za pomocą mongo. Po zalogowaniu dodajemy geo-indeks do kolekcji places:

db.places.ensureIndex({"loc" : "2dsphere"})

Przykładowe zapytanie z $near:

var origin = {type: "Point", coordinates: [0,0]}
db.places.find({ loc: {$near: {$geometry: origin}} })

Wyniki zapytania zapisać w pliku i przekształcić za pomocą programu Jq )lub jakiegoś innego) na obiekty GeoJSON. Wynik zapisać do pliku z rozszerzeniem .geojson.

Github po kliknięciu w plik z rozszerzeniem .geojson wyświetla mapkę zamiast jego zawartości, zob. Mapping geoJSON files on GitHub. Oto przykład, places.geojson.

Mapki umieścić na dowolnej stronie html, np. na GitHub Pages; zob. też Publishing with GitHub Pages, now as easy as 1, 2, 3 i link do mapek wpisać w pliku README.md.

Stronę można też przygotwać korzystając z biblioteki JavaScript D3 – Data-Driven Documents. Zaczynamy od lektury samouczka w którym opisano jak tworzyć mapy tematyczne z linii poleceń – Command-Line Cartography z ndjson-cli.

[Why Manage Your Data]

You’ll know when you’ve gotten past the data management stage: your code starts to become shorter, dealing more with mathematical transforms and less with handling exceptions in the data. It’s nice to come to this stage. It’s a bit like those fights in Lord of the Rings, where you spend a lot of time crossing the murky swamp full of nasty creatures, which isn’t that much of a challenge, but you could die if you don’t pay attention. Then you get out of the swamp and into the evil lair and that’s when things get interesting, short and quick.

Data Management

Zadanie 1

Przeczytać artykuł Exploratory Data Analysis (EDA)?

[Data Cleaning]

Zadanie 1a. Zaimportować do baz danych Elasticsearch i PostgreSQL swój zbior danych.

Zadanie 1b. Na początek zliczyć liczbę zaimportowanych rekordów. Zmierzyć czas jak to długo trwało, jakie było obciążenie rdzeni procesora itp.

Zadanie 1c. Na zaimportowanych danych policzyć kilka agregacji. Wyniki przedstawić graficznie lub w postaci tabelki.

W tym zadaniu należy do liczenia użyć prostych skryptów (programów), po jednym dla Elasticsearch i PostgreSQL.

Najlepiej użyć jednego ze sterowników dla wybranego języka programowania (np. Ruby, Python, JavaScript, Java) dla Elasticsearch i PostgresQL.

Przykładowe agregacji do wykorzystania są opisane w artykułach poniżej (oczywiście, przykłady należy przeliczyć w Elasticsearch i jeśli to możliwe to też w PostgreSQL; jeśli nie będzie to możliwe – napisać dlaczego).

[Ernest Hemingway and marlins]

Wszystko, co musisz zrobić, to napisać jedno prawdziwe zdanie. Napisz najprawdziwsze zdanie, jakie znasz.

— Ernest Hemingway

Zadanie 2 (MongoDB)

1. Dla swoich danych napisać w języku JavaScript kilka agregacji korzystających z Aggregation Pipeline. W agregacjach należy użyć wszystkich tzw. Stage Operators opisanych w dokumentacji Aggregation Pipeline Operators (można pominąć operatory $redact, $sample, $out, $replaceRoot).

2. Przepisać wszystkie agregacje z pkt. 1 na inny niż JavaScript język programowania. Skorzystać z jednego z driverów wymienionych na stronie MongoDB Drivers.

Zadanie 3 (MongoDB)

Napisać kilka par funkcji map-reduce dla dowolnego dużego, czyli zawierającego co najmniej 1_000_000 rekordów/jsonów, zbioru danych.

Przykładowo napisać map-reduce, które wyszukają najczęściej występujące słowa w pliku Wikipedia data PL (aktualny plik z artykułami, ok. 1.3 GB).